From 9b131fbbb88a4a7286d32b8f7bcfc5755ce399c2 Mon Sep 17 00:00:00 2001 From: Christian Wimmer Date: Tue, 29 Dec 2009 19:08:54 +0100 Subject: [PATCH 001/128] 6986046: C1 valuestack cleanup Fixes an historical oddity in C1 with inlining where all of the expression stacks are kept in the topmost ValueStack instead of being in their respective ValueStacks. Reviewed-by: never --- .../src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp | 1 + .../cpu/sparc/vm/c1_LIRGenerator_sparc.cpp | 15 +- hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp | 3 +- .../src/cpu/x86/vm/c1_LIRGenerator_x86.cpp | 16 +- hotspot/src/share/vm/c1/c1_CFGPrinter.cpp | 57 ++- hotspot/src/share/vm/c1/c1_Canonicalizer.cpp | 8 +- hotspot/src/share/vm/c1/c1_Compilation.hpp | 1 - hotspot/src/share/vm/c1/c1_GraphBuilder.cpp | 484 ++++++++---------- hotspot/src/share/vm/c1/c1_GraphBuilder.hpp | 44 +- hotspot/src/share/vm/c1/c1_IR.cpp | 73 +-- hotspot/src/share/vm/c1/c1_IR.hpp | 52 +- hotspot/src/share/vm/c1/c1_Instruction.cpp | 143 ++---- hotspot/src/share/vm/c1/c1_Instruction.hpp | 317 +++++------- .../src/share/vm/c1/c1_InstructionPrinter.cpp | 4 +- hotspot/src/share/vm/c1/c1_LIR.cpp | 8 +- hotspot/src/share/vm/c1/c1_LIRAssembler.cpp | 15 +- hotspot/src/share/vm/c1/c1_LIRGenerator.cpp | 74 +-- hotspot/src/share/vm/c1/c1_LinearScan.cpp | 69 +-- hotspot/src/share/vm/c1/c1_LinearScan.hpp | 2 +- hotspot/src/share/vm/c1/c1_Optimizer.cpp | 32 +- hotspot/src/share/vm/c1/c1_ValueStack.cpp | 221 ++++---- hotspot/src/share/vm/c1/c1_ValueStack.hpp | 138 ++--- hotspot/src/share/vm/c1/c1_globals.hpp | 3 - hotspot/src/share/vm/includeDB_compiler1 | 4 + 24 files changed, 728 insertions(+), 1056 deletions(-) diff --git a/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp b/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp index 709259740f5..4eb6680dfa8 100644 --- a/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp @@ -32,6 +32,7 @@ RangeCheckStub::RangeCheckStub(CodeEmitInfo* info, LIR_Opr index, : _throw_index_out_of_bounds_exception(throw_index_out_of_bounds_exception) , _index(index) { + assert(info != NULL, "must have info"); _info = new CodeEmitInfo(info); } diff --git a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp index dbdf2027dfe..2566f3f8227 100644 --- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp @@ -311,7 +311,7 @@ void LIRGenerator::store_stack_parameter (LIR_Opr item, ByteSize offset_from_sp) void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { - assert(x->is_root(),""); + assert(x->is_pinned(),""); bool needs_range_check = true; bool use_length = x->length() != NULL; bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT; @@ -386,7 +386,7 @@ void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { - assert(x->is_root(),""); + assert(x->is_pinned(),""); LIRItem obj(x->obj(), this); obj.load_item(); @@ -398,7 +398,7 @@ void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { CodeEmitInfo* info_for_exception = NULL; if (x->needs_null_check()) { - info_for_exception = state_for(x, x->lock_stack_before()); + info_for_exception = state_for(x); } // this CodeEmitInfo must not have the xhandlers because here the @@ -409,7 +409,7 @@ void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { void LIRGenerator::do_MonitorExit(MonitorExit* x) { - assert(x->is_root(),""); + assert(x->is_pinned(),""); LIRItem obj(x->obj(), this); obj.dont_load_item(); @@ -871,10 +871,11 @@ void LIRGenerator::do_NewInstance(NewInstance* x) { // This instruction can be deoptimized in the slow path : use // O0 as result register. const LIR_Opr reg = result_register_for(x->type()); - +#ifndef PRODUCT if (PrintNotLoaded && !x->klass()->is_loaded()) { - tty->print_cr(" ###class not loaded at new bci %d", x->bci()); + tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci()); } +#endif CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr tmp1 = FrameMap::G1_oop_opr; LIR_Opr tmp2 = FrameMap::G3_oop_opr; @@ -1018,7 +1019,7 @@ void LIRGenerator::do_CheckCast(CheckCast* x) { obj.load_item(); LIR_Opr out_reg = rlock_result(x); CodeStub* stub; - CodeEmitInfo* info_for_exception = state_for(x, x->state()->copy_locks()); + CodeEmitInfo* info_for_exception = state_for(x); if (x->is_incompatible_class_change_check()) { assert(patching_info == NULL, "can't patch this"); diff --git a/hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp b/hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp index 42269daf59e..f5bea330c2f 100644 --- a/hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp @@ -83,7 +83,8 @@ RangeCheckStub::RangeCheckStub(CodeEmitInfo* info, LIR_Opr index, : _throw_index_out_of_bounds_exception(throw_index_out_of_bounds_exception) , _index(index) { - _info = info == NULL ? NULL : new CodeEmitInfo(info); + assert(info != NULL, "must have info"); + _info = new CodeEmitInfo(info); } diff --git a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp index 05df6bda708..dd8bc8d9962 100644 --- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp @@ -107,7 +107,7 @@ bool LIRGenerator::can_store_as_constant(Value v, BasicType type) const { return false; } Constant* c = v->as_Constant(); - if (c && c->state() == NULL) { + if (c && c->state_before() == NULL) { // constants of any type can be stored directly, except for // unloaded object constants. return true; @@ -250,7 +250,7 @@ void LIRGenerator::store_stack_parameter (LIR_Opr item, ByteSize offset_from_sp) void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { - assert(x->is_root(),""); + assert(x->is_pinned(),""); bool needs_range_check = true; bool use_length = x->length() != NULL; bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT; @@ -325,7 +325,7 @@ void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { - assert(x->is_root(),""); + assert(x->is_pinned(),""); LIRItem obj(x->obj(), this); obj.load_item(); @@ -341,7 +341,7 @@ void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { CodeEmitInfo* info_for_exception = NULL; if (x->needs_null_check()) { - info_for_exception = state_for(x, x->lock_stack_before()); + info_for_exception = state_for(x); } // this CodeEmitInfo must not have the xhandlers because here the // object is already locked (xhandlers expect object to be unlocked) @@ -352,7 +352,7 @@ void LIRGenerator::do_MonitorEnter(MonitorEnter* x) { void LIRGenerator::do_MonitorExit(MonitorExit* x) { - assert(x->is_root(),""); + assert(x->is_pinned(),""); LIRItem obj(x->obj(), this); obj.dont_load_item(); @@ -984,9 +984,11 @@ void LIRGenerator::do_Convert(Convert* x) { void LIRGenerator::do_NewInstance(NewInstance* x) { +#ifndef PRODUCT if (PrintNotLoaded && !x->klass()->is_loaded()) { - tty->print_cr(" ###class not loaded at new bci %d", x->bci()); + tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci()); } +#endif CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr reg = result_register_for(x->type()); LIR_Opr klass_reg = new_register(objectType); @@ -1127,7 +1129,7 @@ void LIRGenerator::do_CheckCast(CheckCast* x) { obj.load_item(); // info for exceptions - CodeEmitInfo* info_for_exception = state_for(x, x->state()->copy_locks()); + CodeEmitInfo* info_for_exception = state_for(x); CodeStub* stub; if (x->is_incompatible_class_change_check()) { diff --git a/hotspot/src/share/vm/c1/c1_CFGPrinter.cpp b/hotspot/src/share/vm/c1/c1_CFGPrinter.cpp index 4a72b166f90..fa1e08ff0f4 100644 --- a/hotspot/src/share/vm/c1/c1_CFGPrinter.cpp +++ b/hotspot/src/share/vm/c1/c1_CFGPrinter.cpp @@ -174,31 +174,6 @@ void CFGPrinterOutput::print_state(BlockBegin* block) { int index; Value value; - if (state->stack_size() > 0) { - print_begin("stack"); - print("size %d", state->stack_size()); - - for_each_stack_value(state, index, value) { - ip.print_phi(index, value, block); - print_operand(value); - output()->cr(); - } - - print_end("stack"); - } - - if (state->locks_size() > 0) { - print_begin("locks"); - print("size %d", state->locks_size()); - - for_each_lock_value(state, index, value) { - ip.print_phi(index, value, block); - print_operand(value); - output()->cr(); - } - print_end("locks"); - } - for_each_state(state) { print_begin("locals"); print("size %d", state->locals_size()); @@ -210,6 +185,33 @@ void CFGPrinterOutput::print_state(BlockBegin* block) { output()->cr(); } print_end("locals"); + + if (state->stack_size() > 0) { + print_begin("stack"); + print("size %d", state->stack_size()); + print("method \"%s\"", method_name(state->scope()->method())); + + for_each_stack_value(state, index, value) { + ip.print_phi(index, value, block); + print_operand(value); + output()->cr(); + } + + print_end("stack"); + } + + if (state->locks_size() > 0) { + print_begin("locks"); + print("size %d", state->locks_size()); + print("method \"%s\"", method_name(state->scope()->method())); + + for_each_lock_value(state, index, value) { + ip.print_phi(index, value, block); + print_operand(value); + output()->cr(); + } + print_end("locks"); + } } print_end("states"); @@ -230,7 +232,8 @@ void CFGPrinterOutput::print_HIR(Value instr) { if (instr->is_pinned()) { output()->put('.'); } - output()->print("%d %d ", instr->bci(), instr->use_count()); + + output()->print("%d %d ", instr->printable_bci(), instr->use_count()); print_operand(instr); @@ -271,7 +274,7 @@ void CFGPrinterOutput::print_block(BlockBegin* block) { print("name \"B%d\"", block->block_id()); print("from_bci %d", block->bci()); - print("to_bci %d", (block->end() == NULL ? -1 : block->end()->bci())); + print("to_bci %d", (block->end() == NULL ? -1 : block->end()->printable_bci())); output()->indent(); output()->print("predecessors "); diff --git a/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp b/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp index ec89b0edd06..024e1ed369a 100644 --- a/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp +++ b/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp @@ -205,7 +205,7 @@ void Canonicalizer::do_StoreField (StoreField* x) { // limit this optimization to current block if (value != NULL && in_current_block(conv)) { set_canonical(new StoreField(x->obj(), x->offset(), x->field(), value, x->is_static(), - x->lock_stack(), x->state_before(), x->is_loaded(), x->is_initialized())); + x->state_before(), x->is_loaded(), x->is_initialized())); return; } } @@ -256,7 +256,7 @@ void Canonicalizer::do_StoreIndexed (StoreIndexed* x) { // limit this optimization to current block if (value != NULL && in_current_block(conv)) { set_canonical(new StoreIndexed(x->array(), x->index(), x->length(), - x->elt_type(), value, x->lock_stack())); + x->elt_type(), value, x->state_before())); return; } } @@ -667,7 +667,7 @@ void Canonicalizer::do_If(If* x) { } } set_canonical(canon); - set_bci(cmp->bci()); + set_bci(cmp->state_before()->bci()); } } } else if (l->as_InstanceOf() != NULL) { @@ -685,7 +685,7 @@ void Canonicalizer::do_If(If* x) { set_canonical(new Goto(is_inst_sux, x->state_before(), x->is_safepoint())); } else { // successors differ => simplify to: IfInstanceOf - set_canonical(new IfInstanceOf(inst->klass(), inst->obj(), true, inst->bci(), is_inst_sux, no_inst_sux)); + set_canonical(new IfInstanceOf(inst->klass(), inst->obj(), true, inst->state_before()->bci(), is_inst_sux, no_inst_sux)); } } } else if (rt == objectNull && (l->as_NewInstance() || l->as_NewArray())) { diff --git a/hotspot/src/share/vm/c1/c1_Compilation.hpp b/hotspot/src/share/vm/c1/c1_Compilation.hpp index a66db089173..cb3ae41c421 100644 --- a/hotspot/src/share/vm/c1/c1_Compilation.hpp +++ b/hotspot/src/share/vm/c1/c1_Compilation.hpp @@ -22,7 +22,6 @@ * */ -class BlockBegin; class CompilationResourceObj; class XHandlers; class ExceptionInfo; diff --git a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp index 5b7b7045aa2..eee48450964 100644 --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp @@ -659,7 +659,6 @@ GraphBuilder::ScopeData::ScopeData(ScopeData* parent) , _jsr_xhandlers(NULL) , _caller_stack_size(-1) , _continuation(NULL) - , _continuation_state(NULL) , _num_returns(0) , _cleanup_block(NULL) , _cleanup_return_prev(NULL) @@ -795,14 +794,6 @@ void GraphBuilder::sort_top_into_worklist(BlockList* worklist, BlockBegin* top) if (i >= -1) worklist->at_put(i + 1, top); } -int GraphBuilder::ScopeData::caller_stack_size() const { - ValueStack* state = scope()->caller_state(); - if (state == NULL) { - return 0; - } - return state->stack_size(); -} - BlockBegin* GraphBuilder::ScopeData::remove_from_work_list() { if (is_work_list_empty()) { @@ -880,7 +871,7 @@ void GraphBuilder::load_constant() { ciObject* obj = con.as_object(); if (!obj->is_loaded() || (PatchALot && obj->klass() != ciEnv::current()->String_klass())) { - patch_state = state()->copy(); + patch_state = copy_state_before(); t = new ObjectConstant(obj); } else { assert(!obj->is_klass(), "must be java_mirror of klass"); @@ -902,7 +893,8 @@ void GraphBuilder::load_constant() { void GraphBuilder::load_local(ValueType* type, int index) { - Value x = state()->load_local(index); + Value x = state()->local_at(index); + assert(x != NULL && !x->type()->is_illegal(), "access of illegal local variable"); push(type, x); } @@ -942,19 +934,21 @@ void GraphBuilder::store_local(ValueStack* state, Value x, ValueType* type, int void GraphBuilder::load_indexed(BasicType type) { + ValueStack* state_before = copy_state_for_exception(); Value index = ipop(); Value array = apop(); Value length = NULL; if (CSEArrayLength || (array->as_AccessField() && array->as_AccessField()->field()->is_constant()) || (array->as_NewArray() && array->as_NewArray()->length() && array->as_NewArray()->length()->type()->is_constant())) { - length = append(new ArrayLength(array, lock_stack())); + length = append(new ArrayLength(array, state_before)); } - push(as_ValueType(type), append(new LoadIndexed(array, index, length, type, lock_stack()))); + push(as_ValueType(type), append(new LoadIndexed(array, index, length, type, state_before))); } void GraphBuilder::store_indexed(BasicType type) { + ValueStack* state_before = copy_state_for_exception(); Value value = pop(as_ValueType(type)); Value index = ipop(); Value array = apop(); @@ -962,9 +956,9 @@ void GraphBuilder::store_indexed(BasicType type) { if (CSEArrayLength || (array->as_AccessField() && array->as_AccessField()->field()->is_constant()) || (array->as_NewArray() && array->as_NewArray()->length() && array->as_NewArray()->length()->type()->is_constant())) { - length = append(new ArrayLength(array, lock_stack())); + length = append(new ArrayLength(array, state_before)); } - StoreIndexed* result = new StoreIndexed(array, index, length, type, value, lock_stack()); + StoreIndexed* result = new StoreIndexed(array, index, length, type, value, state_before); append(result); _memory->store_value(value); @@ -1063,12 +1057,12 @@ void GraphBuilder::stack_op(Bytecodes::Code code) { } -void GraphBuilder::arithmetic_op(ValueType* type, Bytecodes::Code code, ValueStack* stack) { +void GraphBuilder::arithmetic_op(ValueType* type, Bytecodes::Code code, ValueStack* state_before) { Value y = pop(type); Value x = pop(type); // NOTE: strictfp can be queried from current method since we don't // inline methods with differing strictfp bits - Value res = new ArithmeticOp(code, x, y, method()->is_strict(), stack); + Value res = new ArithmeticOp(code, x, y, method()->is_strict(), state_before); // Note: currently single-precision floating-point rounding on Intel is handled at the LIRGenerator level res = append(res); if (method()->is_strict()) { @@ -1132,7 +1126,7 @@ void GraphBuilder::logic_op(ValueType* type, Bytecodes::Code code) { void GraphBuilder::compare_op(ValueType* type, Bytecodes::Code code) { - ValueStack* state_before = state()->copy(); + ValueStack* state_before = copy_state_before(); Value y = pop(type); Value x = pop(type); ipush(append(new CompareOp(code, x, y, state_before))); @@ -1217,7 +1211,7 @@ void GraphBuilder::if_node(Value x, If::Condition cond, Value y, ValueStack* sta void GraphBuilder::if_zero(ValueType* type, If::Condition cond) { Value y = append(new Constant(intZero)); - ValueStack* state_before = state()->copy(); + ValueStack* state_before = copy_state_before(); Value x = ipop(); if_node(x, cond, y, state_before); } @@ -1225,14 +1219,14 @@ void GraphBuilder::if_zero(ValueType* type, If::Condition cond) { void GraphBuilder::if_null(ValueType* type, If::Condition cond) { Value y = append(new Constant(objectNull)); - ValueStack* state_before = state()->copy(); + ValueStack* state_before = copy_state_before(); Value x = apop(); if_node(x, cond, y, state_before); } void GraphBuilder::if_same(ValueType* type, If::Condition cond) { - ValueStack* state_before = state()->copy(); + ValueStack* state_before = copy_state_before(); Value y = pop(type); Value x = pop(type); if_node(x, cond, y, state_before); @@ -1282,7 +1276,7 @@ void GraphBuilder::table_switch() { BlockBegin* tsux = block_at(bci() + switch_->dest_offset_at(0)); BlockBegin* fsux = block_at(bci() + switch_->default_offset()); bool is_bb = tsux->bci() < bci() || fsux->bci() < bci(); - ValueStack* state_before = is_bb ? state() : NULL; + ValueStack* state_before = is_bb ? copy_state_before() : NULL; append(new If(ipop(), If::eql, true, key, tsux, fsux, state_before, is_bb)); } else { // collect successors @@ -1295,7 +1289,7 @@ void GraphBuilder::table_switch() { } // add default successor sux->at_put(i, block_at(bci() + switch_->default_offset())); - ValueStack* state_before = has_bb ? state() : NULL; + ValueStack* state_before = has_bb ? copy_state_before() : NULL; append(new TableSwitch(ipop(), sux, switch_->low_key(), state_before, has_bb)); } } @@ -1314,7 +1308,7 @@ void GraphBuilder::lookup_switch() { BlockBegin* tsux = block_at(bci() + pair->offset()); BlockBegin* fsux = block_at(bci() + switch_->default_offset()); bool is_bb = tsux->bci() < bci() || fsux->bci() < bci(); - ValueStack* state_before = is_bb ? state() : NULL; + ValueStack* state_before = is_bb ? copy_state_before() : NULL; append(new If(ipop(), If::eql, true, key, tsux, fsux, state_before, is_bb)); } else { // collect successors & keys @@ -1330,7 +1324,7 @@ void GraphBuilder::lookup_switch() { } // add default successor sux->at_put(i, block_at(bci() + switch_->default_offset())); - ValueStack* state_before = has_bb ? state() : NULL; + ValueStack* state_before = has_bb ? copy_state_before() : NULL; append(new LookupSwitch(ipop(), sux, keys, state_before, has_bb)); } } @@ -1340,7 +1334,7 @@ void GraphBuilder::call_register_finalizer() { // the registration on return. // Gather some type information about the receiver - Value receiver = state()->load_local(0); + Value receiver = state()->local_at(0); assert(receiver != NULL, "must have a receiver"); ciType* declared_type = receiver->declared_type(); ciType* exact_type = receiver->exact_type(); @@ -1373,10 +1367,11 @@ void GraphBuilder::call_register_finalizer() { if (needs_check) { // Perform the registration of finalizable objects. + ValueStack* state_before = copy_state_for_exception(); load_local(objectType, 0); append_split(new Intrinsic(voidType, vmIntrinsics::_Object_init, state()->pop_arguments(1), - true, lock_stack(), true)); + true, state_before, true)); } } @@ -1395,12 +1390,14 @@ void GraphBuilder::method_return(Value x) { // If the inlined method is synchronized, the monitor must be // released before we jump to the continuation block. if (method()->is_synchronized()) { - int i = state()->caller_state()->locks_size(); - assert(state()->locks_size() == i + 1, "receiver must be locked here"); - monitorexit(state()->lock_at(i), SynchronizationEntryBCI); + assert(state()->locks_size() == 1, "receiver must be locked here"); + monitorexit(state()->lock_at(0), SynchronizationEntryBCI); } - state()->truncate_stack(caller_stack_size()); + // State at end of inlined method is the state of the caller + // without the method parameters on stack, including the + // return value, if any, of the inlined method on operand stack. + set_state(state()->caller_state()->copy_for_parsing()); if (x != NULL) { state()->push(x->type(), x); } @@ -1412,14 +1409,6 @@ void GraphBuilder::method_return(Value x) { set_inline_cleanup_info(_block, _last, state()); } - // State at end of inlined method is the state of the caller - // without the method parameters on stack, including the - // return value, if any, of the inlined method on operand stack. - set_state(scope_data()->continuation_state()->copy()); - if (x) { - state()->push(x->type(), x); - } - // The current bci() is in the wrong scope, so use the bci() of // the continuation point. append_with_bci(goto_callee, scope_data()->continuation()->bci()); @@ -1455,11 +1444,11 @@ void GraphBuilder::access_field(Bytecodes::Code code) { field->will_link(method()->holder(), code); const bool is_initialized = is_loaded && holder->is_initialized(); - ValueStack* state_copy = NULL; + ValueStack* state_before = NULL; if (!is_initialized || PatchALot) { // save state before instruction for debug info when // deoptimization happens during patching - state_copy = state()->copy(); + state_before = copy_state_before(); } Value obj = NULL; @@ -1468,9 +1457,9 @@ void GraphBuilder::access_field(Bytecodes::Code code) { // fully initialized and resolved in this constant pool. The will_link test // above essentially checks if this class is resolved in this constant pool // so, the is_initialized flag should be suffiect. - if (state_copy != NULL) { + if (state_before != NULL) { // build a patching constant - obj = new Constant(new ClassConstant(holder), state_copy); + obj = new Constant(new ClassConstant(holder), state_before); } else { obj = new Constant(new ClassConstant(holder)); } @@ -1499,25 +1488,32 @@ void GraphBuilder::access_field(Bytecodes::Code code) { } if (constant != NULL) { push(type, append(constant)); - state_copy = NULL; // Not a potential deoptimization point (see set_state_before logic below) } else { + if (state_before == NULL) { + state_before = copy_state_for_exception(); + } push(type, append(new LoadField(append(obj), offset, field, true, - lock_stack(), state_copy, is_loaded, is_initialized))); + state_before, is_loaded, is_initialized))); } break; } case Bytecodes::_putstatic: { Value val = pop(type); - append(new StoreField(append(obj), offset, field, val, true, lock_stack(), state_copy, is_loaded, is_initialized)); + if (state_before == NULL) { + state_before = copy_state_for_exception(); + } + append(new StoreField(append(obj), offset, field, val, true, state_before, is_loaded, is_initialized)); } break; case Bytecodes::_getfield : { - LoadField* load = new LoadField(apop(), offset, field, false, lock_stack(), state_copy, is_loaded, true); + if (state_before == NULL) { + state_before = copy_state_for_exception(); + } + LoadField* load = new LoadField(apop(), offset, field, false, state_before, is_loaded, true); Value replacement = is_loaded ? _memory->load(load) : load; if (replacement != load) { - assert(replacement->bci() != -99 || replacement->as_Phi() || replacement->as_Local(), - "should already by linked"); + assert(replacement->is_linked() || !replacement->can_be_linked(), "should already by linked"); push(type, replacement); } else { push(type, append(load)); @@ -1527,7 +1523,10 @@ void GraphBuilder::access_field(Bytecodes::Code code) { case Bytecodes::_putfield : { Value val = pop(type); - StoreField* store = new StoreField(apop(), offset, field, val, false, lock_stack(), state_copy, is_loaded, true); + if (state_before == NULL) { + state_before = copy_state_for_exception(); + } + StoreField* store = new StoreField(apop(), offset, field, val, false, state_before, is_loaded, true); if (is_loaded) store = _memory->store(store); if (store != NULL) { append(store); @@ -1647,7 +1646,7 @@ void GraphBuilder::invoke(Bytecodes::Code code) { actual_recv = target->holder(); // insert a check it's really the expected class. - CheckCast* c = new CheckCast(klass, receiver, NULL); + CheckCast* c = new CheckCast(klass, receiver, copy_state_for_exception()); c->set_incompatible_class_change_check(); c->set_direct_compare(klass->is_final()); append_split(c); @@ -1732,7 +1731,7 @@ void GraphBuilder::invoke(Bytecodes::Code code) { // We require the debug info to be the "state before" because // invokedynamics may deoptimize. - ValueStack* state_before = is_invokedynamic ? state()->copy() : NULL; + ValueStack* state_before = is_invokedynamic ? copy_state_before() : copy_state_exhandling(); Values* args = state()->pop_arguments(target->arg_size_no_receiver()); Value recv = has_receiver ? apop() : NULL; @@ -1795,24 +1794,26 @@ void GraphBuilder::invoke(Bytecodes::Code code) { void GraphBuilder::new_instance(int klass_index) { + ValueStack* state_before = copy_state_exhandling(); bool will_link; ciKlass* klass = stream()->get_klass(will_link); assert(klass->is_instance_klass(), "must be an instance klass"); - NewInstance* new_instance = new NewInstance(klass->as_instance_klass()); + NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before); _memory->new_instance(new_instance); apush(append_split(new_instance)); } void GraphBuilder::new_type_array() { - apush(append_split(new NewTypeArray(ipop(), (BasicType)stream()->get_index()))); + ValueStack* state_before = copy_state_exhandling(); + apush(append_split(new NewTypeArray(ipop(), (BasicType)stream()->get_index(), state_before))); } void GraphBuilder::new_object_array() { bool will_link; ciKlass* klass = stream()->get_klass(will_link); - ValueStack* state_before = !klass->is_loaded() || PatchALot ? state()->copy() : NULL; + ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling(); NewArray* n = new NewObjectArray(klass, ipop(), state_before); apush(append_split(n)); } @@ -1838,7 +1839,7 @@ bool GraphBuilder::direct_compare(ciKlass* k) { void GraphBuilder::check_cast(int klass_index) { bool will_link; ciKlass* klass = stream()->get_klass(will_link); - ValueStack* state_before = !klass->is_loaded() || PatchALot ? state()->copy() : NULL; + ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_for_exception(); CheckCast* c = new CheckCast(klass, apop(), state_before); apush(append_split(c)); c->set_direct_compare(direct_compare(klass)); @@ -1859,7 +1860,7 @@ void GraphBuilder::check_cast(int klass_index) { void GraphBuilder::instance_of(int klass_index) { bool will_link; ciKlass* klass = stream()->get_klass(will_link); - ValueStack* state_before = !klass->is_loaded() || PatchALot ? state()->copy() : NULL; + ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling(); InstanceOf* i = new InstanceOf(klass, apop(), state_before); ipush(append_split(i)); i->set_direct_compare(direct_compare(klass)); @@ -1879,25 +1880,13 @@ void GraphBuilder::instance_of(int klass_index) { void GraphBuilder::monitorenter(Value x, int bci) { // save state before locking in case of deoptimization after a NullPointerException - ValueStack* lock_stack_before = lock_stack(); - append_with_bci(new MonitorEnter(x, state()->lock(scope(), x), lock_stack_before), bci); + ValueStack* state_before = copy_state_for_exception_with_bci(bci); + append_with_bci(new MonitorEnter(x, state()->lock(x), state_before), bci); kill_all(); } void GraphBuilder::monitorexit(Value x, int bci) { - // Note: the comment below is only relevant for the case where we do - // not deoptimize due to asynchronous exceptions (!(DeoptC1 && - // DeoptOnAsyncException), which is not used anymore) - - // Note: Potentially, the monitor state in an exception handler - // can be wrong due to wrong 'initialization' of the handler - // via a wrong asynchronous exception path. This can happen, - // if the exception handler range for asynchronous exceptions - // is too long (see also java bug 4327029, and comment in - // GraphBuilder::handle_exception()). This may cause 'under- - // flow' of the monitor stack => bailout instead. - if (state()->locks_size() < 1) BAILOUT("monitor stack underflow"); append_with_bci(new MonitorExit(x, state()->unlock()), bci); kill_all(); } @@ -1906,7 +1895,7 @@ void GraphBuilder::monitorexit(Value x, int bci) { void GraphBuilder::new_multi_array(int dimensions) { bool will_link; ciKlass* klass = stream()->get_klass(will_link); - ValueStack* state_before = !klass->is_loaded() || PatchALot ? state()->copy() : NULL; + ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling(); Values* dims = new Values(dimensions, NULL); // fill in all dimensions @@ -1921,8 +1910,10 @@ void GraphBuilder::new_multi_array(int dimensions) { void GraphBuilder::throw_op(int bci) { // We require that the debug info for a Throw be the "state before" // the Throw (i.e., exception oop is still on TOS) - ValueStack* state_before = state()->copy(); + ValueStack* state_before = copy_state_before_with_bci(bci); Throw* t = new Throw(apop(), state_before); + // operand stack not needed after a throw + state()->truncate_stack(0); append_with_bci(t, bci); } @@ -1947,60 +1938,62 @@ Value GraphBuilder::round_fp(Value fp_value) { Instruction* GraphBuilder::append_with_bci(Instruction* instr, int bci) { Canonicalizer canon(compilation(), instr, bci); Instruction* i1 = canon.canonical(); - if (i1->bci() != -99) { + if (i1->is_linked() || !i1->can_be_linked()) { // Canonicalizer returned an instruction which was already // appended so simply return it. return i1; - } else if (UseLocalValueNumbering) { + } + + if (UseLocalValueNumbering) { // Lookup the instruction in the ValueMap and add it to the map if // it's not found. Instruction* i2 = vmap()->find_insert(i1); if (i2 != i1) { // found an entry in the value map, so just return it. - assert(i2->bci() != -1, "should already be linked"); + assert(i2->is_linked(), "should already be linked"); return i2; } ValueNumberingEffects vne(vmap()); i1->visit(&vne); } - if (i1->as_Phi() == NULL && i1->as_Local() == NULL) { - // i1 was not eliminated => append it - assert(i1->next() == NULL, "shouldn't already be linked"); - _last = _last->set_next(i1, canon.bci()); - if (++_instruction_count >= InstructionCountCutoff - && !bailed_out()) { - // set the bailout state but complete normal processing. We - // might do a little more work before noticing the bailout so we - // want processing to continue normally until it's noticed. - bailout("Method and/or inlining is too large"); - } + // i1 was not eliminated => append it + assert(i1->next() == NULL, "shouldn't already be linked"); + _last = _last->set_next(i1, canon.bci()); + + if (++_instruction_count >= InstructionCountCutoff && !bailed_out()) { + // set the bailout state but complete normal processing. We + // might do a little more work before noticing the bailout so we + // want processing to continue normally until it's noticed. + bailout("Method and/or inlining is too large"); + } #ifndef PRODUCT - if (PrintIRDuringConstruction) { - InstructionPrinter ip; - ip.print_line(i1); - if (Verbose) { - state()->print(); - } + if (PrintIRDuringConstruction) { + InstructionPrinter ip; + ip.print_line(i1); + if (Verbose) { + state()->print(); } + } #endif - assert(_last == i1, "adjust code below"); - StateSplit* s = i1->as_StateSplit(); - if (s != NULL && i1->as_BlockEnd() == NULL) { - if (EliminateFieldAccess) { - Intrinsic* intrinsic = s->as_Intrinsic(); - if (s->as_Invoke() != NULL || (intrinsic && !intrinsic->preserves_state())) { - _memory->kill(); - } + + // save state after modification of operand stack for StateSplit instructions + StateSplit* s = i1->as_StateSplit(); + if (s != NULL) { + if (EliminateFieldAccess) { + Intrinsic* intrinsic = s->as_Intrinsic(); + if (s->as_Invoke() != NULL || (intrinsic && !intrinsic->preserves_state())) { + _memory->kill(); } - s->set_state(state()->copy()); - } - // set up exception handlers for this instruction if necessary - if (i1->can_trap()) { - assert(exception_state() != NULL || !has_handler(), "must have setup exception state"); - i1->set_exception_handlers(handle_exception(bci)); } + s->set_state(state()->copy(ValueStack::StateAfter, canon.bci())); + } + + // set up exception handlers for this instruction if necessary + if (i1->can_trap()) { + i1->set_exception_handlers(handle_exception(i1)); + assert(i1->exception_state() != NULL || !i1->needs_exception_state() || bailed_out(), "handle_exception must set exception state"); } return i1; } @@ -2032,26 +2025,30 @@ void GraphBuilder::null_check(Value value) { } } } - append(new NullCheck(value, lock_stack())); + append(new NullCheck(value, copy_state_for_exception())); } -XHandlers* GraphBuilder::handle_exception(int cur_bci) { - // fast path if it is guaranteed that no exception handlers are present - if (!has_handler()) { - // TODO: check if return NULL is possible (avoids empty lists) +XHandlers* GraphBuilder::handle_exception(Instruction* instruction) { + if (!has_handler() && (!instruction->needs_exception_state() || instruction->exception_state() != NULL)) { + assert(instruction->exception_state() == NULL + || instruction->exception_state()->kind() == ValueStack::EmptyExceptionState + || (instruction->exception_state()->kind() == ValueStack::ExceptionState && _compilation->env()->jvmti_can_access_local_variables()), + "exception_state should be of exception kind"); return new XHandlers(); } XHandlers* exception_handlers = new XHandlers(); ScopeData* cur_scope_data = scope_data(); - ValueStack* s = exception_state(); + ValueStack* cur_state = instruction->state_before(); + ValueStack* prev_state = NULL; int scope_count = 0; - assert(s != NULL, "exception state must be set"); + assert(cur_state != NULL, "state_before must be set"); do { - assert(cur_scope_data->scope() == s->scope(), "scopes do not match"); + int cur_bci = cur_state->bci(); + assert(cur_scope_data->scope() == cur_state->scope(), "scopes do not match"); assert(cur_bci == SynchronizationEntryBCI || cur_bci == cur_scope_data->stream()->cur_bci(), "invalid bci"); // join with all potential exception handlers @@ -2075,10 +2072,15 @@ XHandlers* GraphBuilder::handle_exception(int cur_bci) { // previously this was a BAILOUT, but this is not necessary // now because asynchronous exceptions are not handled this way. - assert(entry->state() == NULL || s->locks_size() == entry->state()->locks_size(), "locks do not match"); + assert(entry->state() == NULL || cur_state->total_locks_size() == entry->state()->total_locks_size(), "locks do not match"); // xhandler start with an empty expression stack - s->truncate_stack(cur_scope_data->caller_stack_size()); + if (cur_state->stack_size() != 0) { + cur_state = cur_state->copy(ValueStack::ExceptionState, cur_state->bci()); + } + if (instruction->exception_state() == NULL) { + instruction->set_exception_state(cur_state); + } // Note: Usually this join must work. However, very // complicated jsr-ret structures where we don't ret from @@ -2087,12 +2089,12 @@ XHandlers* GraphBuilder::handle_exception(int cur_bci) { // The only test case we've seen so far which exhibits this // problem is caught by the infinite recursion test in // GraphBuilder::jsr() if the join doesn't work. - if (!entry->try_merge(s)) { + if (!entry->try_merge(cur_state)) { BAILOUT_("error while joining with exception handler, prob. due to complicated jsr/rets", exception_handlers); } // add current state for correct handling of phi functions at begin of xhandler - int phi_operand = entry->add_exception_state(s); + int phi_operand = entry->add_exception_state(cur_state); // add entry to the list of xhandlers of this block _block->add_exception_handler(entry); @@ -2119,26 +2121,39 @@ XHandlers* GraphBuilder::handle_exception(int cur_bci) { } } + if (exception_handlers->length() == 0) { + // This scope and all callees do not handle exceptions, so the local + // variables of this scope are not needed. However, the scope itself is + // required for a correct exception stack trace -> clear out the locals. + if (_compilation->env()->jvmti_can_access_local_variables()) { + cur_state = cur_state->copy(ValueStack::ExceptionState, cur_state->bci()); + } else { + cur_state = cur_state->copy(ValueStack::EmptyExceptionState, cur_state->bci()); + } + if (prev_state != NULL) { + prev_state->set_caller_state(cur_state); + } + if (instruction->exception_state() == NULL) { + instruction->set_exception_state(cur_state); + } + } + // Set up iteration for next time. // If parsing a jsr, do not grab exception handlers from the // parent scopes for this method (already got them, and they // needed to be cloned) - if (cur_scope_data->parsing_jsr()) { - IRScope* tmp_scope = cur_scope_data->scope(); - while (cur_scope_data->parent() != NULL && - cur_scope_data->parent()->scope() == tmp_scope) { - cur_scope_data = cur_scope_data->parent(); - } - } - if (cur_scope_data != NULL) { - if (cur_scope_data->parent() != NULL) { - // must use pop_scope instead of caller_state to preserve all monitors - s = s->pop_scope(); - } - cur_bci = cur_scope_data->scope()->caller_bci(); + + while (cur_scope_data->parsing_jsr()) { cur_scope_data = cur_scope_data->parent(); - scope_count++; } + + assert(cur_scope_data->scope() == cur_state->scope(), "scopes do not match"); + assert(cur_state->locks_size() == 0 || cur_state->locks_size() == 1, "unlocking must be done in a catchall exception handler"); + + prev_state = cur_state; + cur_state = cur_state->caller_state(); + cur_scope_data = cur_scope_data->parent(); + scope_count++; } while (cur_scope_data != NULL); return exception_handlers; @@ -2243,14 +2258,10 @@ void PhiSimplifier::block_do(BlockBegin* b) { ); ValueStack* state = b->state()->caller_state(); - int index; - Value value; - for_each_state(state) { - for_each_local_value(state, index, value) { - Phi* phi = value->as_Phi(); - assert(phi == NULL || phi->block() != b, "must not have phi function to simplify in caller state"); - } - } + for_each_state_value(state, value, + Phi* phi = value->as_Phi(); + assert(phi == NULL || phi->block() != b, "must not have phi function to simplify in caller state"); + ); #endif } @@ -2265,7 +2276,7 @@ void GraphBuilder::connect_to_end(BlockBegin* beg) { // setup iteration kill_all(); _block = beg; - _state = beg->state()->copy(); + _state = beg->state()->copy_for_parsing(); _last = beg; iterate_bytecodes_for_block(beg->bci()); } @@ -2301,14 +2312,7 @@ BlockEnd* GraphBuilder::iterate_bytecodes_for_block(int bci) { while (!bailed_out() && last()->as_BlockEnd() == NULL && (code = stream()->next()) != ciBytecodeStream::EOBC() && (block_at(s.cur_bci()) == NULL || block_at(s.cur_bci()) == block())) { - - if (has_handler() && can_trap(method(), code)) { - // copy the state because it is modified before handle_exception is called - set_exception_state(state()->copy()); - } else { - // handle_exception is not called for this bytecode - set_exception_state(NULL); - } + assert(state()->kind() == ValueStack::Parsing, "invalid state kind"); // Check for active jsr during OSR compilation if (compilation()->is_osr_compile() @@ -2433,12 +2437,12 @@ BlockEnd* GraphBuilder::iterate_bytecodes_for_block(int bci) { case Bytecodes::_lmul : arithmetic_op(longType , code); break; case Bytecodes::_fmul : arithmetic_op(floatType , code); break; case Bytecodes::_dmul : arithmetic_op(doubleType, code); break; - case Bytecodes::_idiv : arithmetic_op(intType , code, lock_stack()); break; - case Bytecodes::_ldiv : arithmetic_op(longType , code, lock_stack()); break; + case Bytecodes::_idiv : arithmetic_op(intType , code, copy_state_for_exception()); break; + case Bytecodes::_ldiv : arithmetic_op(longType , code, copy_state_for_exception()); break; case Bytecodes::_fdiv : arithmetic_op(floatType , code); break; case Bytecodes::_ddiv : arithmetic_op(doubleType, code); break; - case Bytecodes::_irem : arithmetic_op(intType , code, lock_stack()); break; - case Bytecodes::_lrem : arithmetic_op(longType , code, lock_stack()); break; + case Bytecodes::_irem : arithmetic_op(intType , code, copy_state_for_exception()); break; + case Bytecodes::_lrem : arithmetic_op(longType , code, copy_state_for_exception()); break; case Bytecodes::_frem : arithmetic_op(floatType , code); break; case Bytecodes::_drem : arithmetic_op(doubleType, code); break; case Bytecodes::_ineg : negate_op(intType ); break; @@ -2515,11 +2519,10 @@ BlockEnd* GraphBuilder::iterate_bytecodes_for_block(int bci) { case Bytecodes::_new : new_instance(s.get_index_u2()); break; case Bytecodes::_newarray : new_type_array(); break; case Bytecodes::_anewarray : new_object_array(); break; - case Bytecodes::_arraylength : ipush(append(new ArrayLength(apop(), lock_stack()))); break; + case Bytecodes::_arraylength : { ValueStack* state_before = copy_state_for_exception(); ipush(append(new ArrayLength(apop(), state_before))); break; } case Bytecodes::_athrow : throw_op(s.cur_bci()); break; case Bytecodes::_checkcast : check_cast(s.get_index_u2()); break; case Bytecodes::_instanceof : instance_of(s.get_index_u2()); break; - // Note: we do not have special handling for the monitorenter bytecode if DeoptC1 && DeoptOnAsyncException case Bytecodes::_monitorenter : monitorenter(apop(), s.cur_bci()); break; case Bytecodes::_monitorexit : monitorexit (apop(), s.cur_bci()); break; case Bytecodes::_wide : ShouldNotReachHere(); break; @@ -2546,28 +2549,22 @@ BlockEnd* GraphBuilder::iterate_bytecodes_for_block(int bci) { if (end == NULL) { // all blocks must end with a BlockEnd instruction => add a Goto end = new Goto(block_at(s.cur_bci()), false); - _last = _last->set_next(end, prev_bci); + append(end); } assert(end == last()->as_BlockEnd(), "inconsistency"); - // if the method terminates, we don't need the stack anymore - if (end->as_Return() != NULL) { - state()->clear_stack(); - } else if (end->as_Throw() != NULL) { - // May have exception handler in caller scopes - state()->truncate_stack(scope()->lock_stack_size()); - } + assert(end->state() != NULL, "state must already be present"); + assert(end->as_Return() == NULL || end->as_Throw() == NULL || end->state()->stack_size() == 0, "stack not needed for return and throw"); // connect to begin & set state // NOTE that inlining may have changed the block we are parsing block()->set_end(end); - end->set_state(state()); // propagate state for (int i = end->number_of_sux() - 1; i >= 0; i--) { BlockBegin* sux = end->sux_at(i); assert(sux->is_predecessor(block()), "predecessor missing"); // be careful, bailout if bytecodes are strange - if (!sux->try_merge(state())) BAILOUT_("block join failed", NULL); + if (!sux->try_merge(end->state())) BAILOUT_("block join failed", NULL); scope_data()->add_to_work_list(end->sux_at(i)); } @@ -2605,7 +2602,6 @@ void GraphBuilder::iterate_all_blocks(bool start_in_current_block_for_inlining) bool GraphBuilder::_can_trap [Bytecodes::number_of_java_codes]; -bool GraphBuilder::_is_async[Bytecodes::number_of_java_codes]; void GraphBuilder::initialize() { // the following bytecodes are assumed to potentially @@ -2657,67 +2653,14 @@ void GraphBuilder::initialize() { , Bytecodes::_multianewarray }; - // the following bytecodes are assumed to potentially - // throw asynchronous exceptions in compiled code due - // to safepoints (note: these entries could be merged - // with the can_trap_list - however, we need to know - // which ones are asynchronous for now - see also the - // comment in GraphBuilder::handle_exception) - Bytecodes::Code is_async_list[] = - { Bytecodes::_ifeq - , Bytecodes::_ifne - , Bytecodes::_iflt - , Bytecodes::_ifge - , Bytecodes::_ifgt - , Bytecodes::_ifle - , Bytecodes::_if_icmpeq - , Bytecodes::_if_icmpne - , Bytecodes::_if_icmplt - , Bytecodes::_if_icmpge - , Bytecodes::_if_icmpgt - , Bytecodes::_if_icmple - , Bytecodes::_if_acmpeq - , Bytecodes::_if_acmpne - , Bytecodes::_goto - , Bytecodes::_jsr - , Bytecodes::_ret - , Bytecodes::_tableswitch - , Bytecodes::_lookupswitch - , Bytecodes::_ireturn - , Bytecodes::_lreturn - , Bytecodes::_freturn - , Bytecodes::_dreturn - , Bytecodes::_areturn - , Bytecodes::_return - , Bytecodes::_ifnull - , Bytecodes::_ifnonnull - , Bytecodes::_goto_w - , Bytecodes::_jsr_w - }; - // inititialize trap tables for (int i = 0; i < Bytecodes::number_of_java_codes; i++) { _can_trap[i] = false; - _is_async[i] = false; } // set standard trap info for (uint j = 0; j < ARRAY_SIZE(can_trap_list); j++) { _can_trap[can_trap_list[j]] = true; } - - // We now deoptimize if an asynchronous exception is thrown. This - // considerably cleans up corner case issues related to javac's - // incorrect exception handler ranges for async exceptions and - // allows us to precisely analyze the types of exceptions from - // certain bytecodes. - if (!(DeoptC1 && DeoptOnAsyncException)) { - // set asynchronous trap info - for (uint k = 0; k < ARRAY_SIZE(is_async_list); k++) { - assert(!_can_trap[is_async_list[k]], "can_trap_list and is_async_list should be disjoint"); - _can_trap[is_async_list[k]] = true; - _is_async[is_async_list[k]] = true; - } - } } @@ -2733,7 +2676,7 @@ BlockBegin* GraphBuilder::header_block(BlockBegin* entry, BlockBegin::Flag f, Va h->set_end(g); h->set(f); // setup header block end state - ValueStack* s = state->copy(); // can use copy since stack is empty (=> no phis) + ValueStack* s = state->copy(ValueStack::StateAfter, entry->bci()); // can use copy since stack is empty (=> no phis) assert(s->stack_is_empty(), "must have empty stack at entry point"); g->set_state(s); return h; @@ -2768,8 +2711,8 @@ BlockBegin* GraphBuilder::setup_start_block(int osr_bci, BlockBegin* std_entry, start->set_next(base, 0); start->set_end(base); // create & setup state for start block - start->set_state(state->copy()); - base->set_state(state->copy()); + start->set_state(state->copy(ValueStack::StateAfter, std_entry->bci())); + base->set_state(state->copy(ValueStack::StateAfter, std_entry->bci())); if (base->std_entry()->state() == NULL) { // setup states for header blocks @@ -2803,6 +2746,7 @@ void GraphBuilder::setup_osr_entry_block() { kill_all(); _block = _osr_entry; _state = _osr_entry->state()->copy(); + assert(_state->bci() == osr_bci, "mismatch"); _last = _osr_entry; Value e = append(new OsrEntry()); e->set_needs_null_check(false); @@ -2852,7 +2796,6 @@ void GraphBuilder::setup_osr_entry_block() { assert(state->caller_state() == NULL, "should be top scope"); state->clear_locals(); Goto* g = new Goto(target, false); - g->set_state(_state->copy()); append(g); _osr_entry->set_end(g); target->merge(_osr_entry->end()->state()); @@ -2862,7 +2805,7 @@ void GraphBuilder::setup_osr_entry_block() { ValueStack* GraphBuilder::state_at_entry() { - ValueStack* state = new ValueStack(scope(), method()->max_locals(), method()->max_stack()); + ValueStack* state = new ValueStack(scope(), NULL); // Set up locals for receiver int idx = 0; @@ -2886,7 +2829,7 @@ ValueStack* GraphBuilder::state_at_entry() { // lock synchronized method if (method()->is_synchronized()) { - state->lock(scope(), NULL); + state->lock(NULL); } return state; @@ -2895,7 +2838,6 @@ ValueStack* GraphBuilder::state_at_entry() { GraphBuilder::GraphBuilder(Compilation* compilation, IRScope* scope) : _scope_data(NULL) - , _exception_state(NULL) , _instruction_count(0) , _osr_entry(NULL) , _memory(new MemoryBuffer()) @@ -2919,7 +2861,6 @@ GraphBuilder::GraphBuilder(Compilation* compilation, IRScope* scope) // complete graph _vmap = new ValueMap(); - scope->compute_lock_stack_size(); switch (scope->method()->intrinsic_id()) { case vmIntrinsics::_dabs : // fall through case vmIntrinsics::_dsqrt : // fall through @@ -2945,7 +2886,7 @@ GraphBuilder::GraphBuilder(Compilation* compilation, IRScope* scope) // setup the initial block state _block = start_block; - _state = start_block->state()->copy(); + _state = start_block->state()->copy_for_parsing(); _last = start_block; load_local(doubleType, 0); @@ -2957,7 +2898,6 @@ GraphBuilder::GraphBuilder(Compilation* compilation, IRScope* scope) // connect the begin and end blocks and we're all done. BlockEnd* end = last()->as_BlockEnd(); block()->set_end(end); - end->set_state(state()); break; } default: @@ -2988,13 +2928,38 @@ GraphBuilder::GraphBuilder(Compilation* compilation, IRScope* scope) } -ValueStack* GraphBuilder::lock_stack() { - // return a new ValueStack representing just the current lock stack - // (for debug info at safepoints in exception throwing or handling) - ValueStack* new_stack = state()->copy_locks(); - return new_stack; +ValueStack* GraphBuilder::copy_state_before() { + return copy_state_before_with_bci(bci()); } +ValueStack* GraphBuilder::copy_state_exhandling() { + return copy_state_exhandling_with_bci(bci()); +} + +ValueStack* GraphBuilder::copy_state_for_exception() { + return copy_state_for_exception_with_bci(bci()); +} + +ValueStack* GraphBuilder::copy_state_before_with_bci(int bci) { + return state()->copy(ValueStack::StateBefore, bci); +} + +ValueStack* GraphBuilder::copy_state_exhandling_with_bci(int bci) { + if (!has_handler()) return NULL; + return state()->copy(ValueStack::StateBefore, bci); +} + +ValueStack* GraphBuilder::copy_state_for_exception_with_bci(int bci) { + ValueStack* s = copy_state_exhandling_with_bci(bci); + if (s == NULL) { + if (_compilation->env()->jvmti_can_access_local_variables()) { + s = state()->copy(ValueStack::ExceptionState, bci); + } else { + s = state()->copy(ValueStack::EmptyExceptionState, bci); + } + } + return s; +} int GraphBuilder::recursive_inline_level(ciMethod* cur_callee) const { int recur_level = 0; @@ -3177,9 +3142,9 @@ bool GraphBuilder::try_inline_intrinsics(ciMethod* callee) { // create intrinsic node const bool has_receiver = !callee->is_static(); ValueType* result_type = as_ValueType(callee->return_type()); + ValueStack* state_before = copy_state_for_exception(); Values* args = state()->pop_arguments(callee->arg_size()); - ValueStack* locks = lock_stack(); if (is_profiling()) { // Don't profile in the special case where the root method @@ -3198,7 +3163,7 @@ bool GraphBuilder::try_inline_intrinsics(ciMethod* callee) { } } - Intrinsic* result = new Intrinsic(result_type, id, args, has_receiver, lock_stack(), + Intrinsic* result = new Intrinsic(result_type, id, args, has_receiver, state_before, preserves_state, cantrap); // append instruction & push result Value value = append_split(result); @@ -3236,10 +3201,9 @@ bool GraphBuilder::try_inline_jsr(int jsr_dest_bci) { assert(jsr_start_block != NULL, "jsr start block must exist"); assert(!jsr_start_block->is_set(BlockBegin::was_visited_flag), "should not have visited jsr yet"); Goto* goto_sub = new Goto(jsr_start_block, false); - goto_sub->set_state(state()); // Must copy state to avoid wrong sharing when parsing bytecodes assert(jsr_start_block->state() == NULL, "should have fresh jsr starting block"); - jsr_start_block->set_state(state()->copy()); + jsr_start_block->set_state(copy_state_before_with_bci(jsr_dest_bci)); append(goto_sub); _block->set_end(goto_sub); _last = _block = jsr_start_block; @@ -3290,7 +3254,6 @@ bool GraphBuilder::try_inline_jsr(int jsr_dest_bci) { void GraphBuilder::inline_sync_entry(Value lock, BlockBegin* sync_handler) { assert(lock != NULL && sync_handler != NULL, "lock or handler missing"); - set_exception_state(state()->copy()); monitorenter(lock, SynchronizationEntryBCI); assert(_last->as_MonitorEnter() != NULL, "monitor enter expected"); _last->set_needs_null_check(false); @@ -3332,7 +3295,7 @@ void GraphBuilder::fill_sync_handler(Value lock, BlockBegin* sync_handler, bool int bci = SynchronizationEntryBCI; if (lock) { assert(state()->locks_size() > 0 && state()->lock_at(state()->locks_size() - 1) == lock, "lock is missing"); - if (lock->bci() == -99) { + if (!lock->is_linked()) { lock = append_with_bci(lock, -1); } @@ -3342,21 +3305,17 @@ void GraphBuilder::fill_sync_handler(Value lock, BlockBegin* sync_handler, bool // exit the context of the synchronized method if (!default_handler) { pop_scope(); - _state = _state->copy(); - bci = _state->scope()->caller_bci(); - _state = _state->pop_scope()->copy(); + bci = _state->caller_state()->bci(); + _state = _state->caller_state()->copy_for_parsing(); } } // perform the throw as if at the the call site apush(exception); - - set_exception_state(state()->copy()); throw_op(bci); BlockEnd* end = last()->as_BlockEnd(); block()->set_end(end); - end->set_state(state()); _block = orig_block; _state = orig_state; @@ -3487,7 +3446,7 @@ bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known) { // Pass parameters into callee state: add assignments // note: this will also ensure that all arguments are computed before being passed ValueStack* callee_state = state(); - ValueStack* caller_state = scope()->caller_state(); + ValueStack* caller_state = state()->caller_state(); { int i = args_base; while (i < caller_state->stack_size()) { const int par_no = i - args_base; @@ -3502,16 +3461,7 @@ bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known) { // Note that we preserve locals state in case we can use it later // (see use of pop_scope() below) caller_state->truncate_stack(args_base); - callee_state->truncate_stack(args_base); - - // Setup state that is used at returns form the inlined method. - // This is essentially the state of the continuation block, - // but without the return value on stack, if any, this will - // be pushed at the return instruction (see method_return). - scope_data()->set_continuation_state(caller_state->copy()); - - // Compute lock stack size for callee scope now that args have been passed - scope()->compute_lock_stack_size(); + assert(callee_state->stack_size() == 0, "callee stack must be empty"); Value lock; BlockBegin* sync_handler; @@ -3520,11 +3470,8 @@ bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known) { if (callee->is_synchronized()) { lock = callee->is_static() ? append(new Constant(new InstanceConstant(callee->holder()->java_mirror()))) : state()->local_at(0); - sync_handler = new BlockBegin(-1); + sync_handler = new BlockBegin(SynchronizationEntryBCI); inline_sync_entry(lock, sync_handler); - - // recompute the lock stack size - scope()->compute_lock_stack_size(); } @@ -3532,7 +3479,6 @@ bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known) { if (callee_start_block != NULL) { assert(callee_start_block->is_set(BlockBegin::parser_loop_header_flag), "must be loop header"); Goto* goto_callee = new Goto(callee_start_block, false); - goto_callee->set_state(state()); // The state for this goto is in the scope of the callee, so use // the entry bci for the callee instead of the call site bci. append_with_bci(goto_callee, 0); @@ -3579,7 +3525,7 @@ bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known) { && block() == orig_block && block() == inline_cleanup_block()) { _last = inline_cleanup_return_prev(); - _state = inline_cleanup_state()->pop_scope(); + _state = inline_cleanup_state(); } else if (continuation_preds == cont->number_of_preds()) { // Inlining caused that the instructions after the invoke in the // caller are not reachable any more. So skip filling this block @@ -3645,8 +3591,7 @@ void GraphBuilder::push_scope(ciMethod* callee, BlockBegin* continuation) { blb.bci2block()->at_put(0, NULL); } - callee_scope->set_caller_state(state()); - set_state(state()->push_scope(callee_scope)); + set_state(new ValueStack(callee_scope, state()->copy(ValueStack::CallerState, bci()))); ScopeData* data = new ScopeData(scope_data()); data->set_scope(callee_scope); @@ -3670,10 +3615,6 @@ void GraphBuilder::push_scope_for_jsr(BlockBegin* jsr_continuation, int jsr_dest data->set_scope(scope()); data->setup_jsr_xhandlers(); data->set_continuation(continuation()); - if (continuation() != NULL) { - assert(continuation_state() != NULL, ""); - data->set_continuation_state(continuation_state()->copy()); - } data->set_jsr_continuation(jsr_continuation); _scope_data = data; } @@ -3768,6 +3709,7 @@ bool GraphBuilder::append_unsafe_prefetch(ciMethod* callee, bool is_static, bool void GraphBuilder::append_unsafe_CAS(ciMethod* callee) { + ValueStack* state_before = copy_state_for_exception(); ValueType* result_type = as_ValueType(callee->return_type()); assert(result_type->is_int(), "int result"); Values* args = state()->pop_arguments(callee->arg_size()); @@ -3796,7 +3738,7 @@ void GraphBuilder::append_unsafe_CAS(ciMethod* callee) { // know which ones so mark the state as no preserved. This will // cause CSE to invalidate memory across it. bool preserves_state = false; - Intrinsic* result = new Intrinsic(result_type, callee->intrinsic_id(), args, false, lock_stack(), preserves_state); + Intrinsic* result = new Intrinsic(result_type, callee->intrinsic_id(), args, false, state_before, preserves_state); append_split(result); push(result_type, result); compilation()->set_has_unsafe_access(true); diff --git a/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp b/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp index 1a6c6f28d22..76699ef82a0 100644 --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp @@ -58,9 +58,6 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { // BlockEnds. BlockBegin* _continuation; - // Without return value of inlined method on stack - ValueStack* _continuation_state; - // Was this ScopeData created only for the parsing and inlining of // a jsr? bool _parsing_jsr; @@ -125,14 +122,10 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { void set_stream(ciBytecodeStream* stream) { _stream = stream; } intx max_inline_size() const { return _max_inline_size; } - int caller_stack_size() const; BlockBegin* continuation() const { return _continuation; } void set_continuation(BlockBegin* cont) { _continuation = cont; } - ValueStack* continuation_state() const { return _continuation_state; } - void set_continuation_state(ValueStack* s) { _continuation_state = s; } - // Indicates whether this ScopeData was pushed only for the // parsing and inlining of a jsr bool parsing_jsr() const { return _parsing_jsr; } @@ -163,7 +156,6 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { // for all GraphBuilders static bool _can_trap[Bytecodes::number_of_java_codes]; - static bool _is_async[Bytecodes::number_of_java_codes]; // for each instance of GraphBuilder ScopeData* _scope_data; // Per-scope data; used for inlining @@ -179,7 +171,6 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { // for each call to connect_to_end; can also be set by inliner BlockBegin* _block; // the current block ValueStack* _state; // the current execution state - ValueStack* _exception_state; // state that will be used by handle_exception Instruction* _last; // the last instruction added bool _skip_block; // skip processing of the rest of this block @@ -194,8 +185,6 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { ValueStack* state() const { return _state; } void set_state(ValueStack* state) { _state = state; } IRScope* scope() const { return scope_data()->scope(); } - ValueStack* exception_state() const { return _exception_state; } - void set_exception_state(ValueStack* s) { _exception_state = s; } ciMethod* method() const { return scope()->method(); } ciBytecodeStream* stream() const { return scope_data()->stream(); } Instruction* last() const { return _last; } @@ -230,7 +219,7 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { void load_indexed (BasicType type); void store_indexed(BasicType type); void stack_op(Bytecodes::Code code); - void arithmetic_op(ValueType* type, Bytecodes::Code code, ValueStack* lock_stack = NULL); + void arithmetic_op(ValueType* type, Bytecodes::Code code, ValueStack* state_before = NULL); void negate_op(ValueType* type); void shift_op(ValueType* type, Bytecodes::Code code); void logic_op(ValueType* type, Bytecodes::Code code); @@ -267,12 +256,8 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { Instruction* append_split(StateSplit* instr); // other helpers - static bool is_async(Bytecodes::Code code) { - assert(0 <= code && code < Bytecodes::number_of_java_codes, "illegal bytecode"); - return _is_async[code]; - } BlockBegin* block_at(int bci) { return scope_data()->block_at(bci); } - XHandlers* handle_exception(int bci); + XHandlers* handle_exception(Instruction* instruction); void connect_to_end(BlockBegin* beg); void null_check(Value value); void eliminate_redundant_phis(BlockBegin* start); @@ -283,7 +268,28 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { void kill_all(); - ValueStack* lock_stack(); + // use of state copy routines (try to minimize unnecessary state + // object allocations): + + // - if the instruction unconditionally needs a full copy of the + // state (for patching for example), then use copy_state_before* + + // - if the instruction needs a full copy of the state only for + // handler generation (Instruction::needs_exception_state() returns + // false) then use copy_state_exhandling* + + // - if the instruction needs either a full copy of the state for + // handler generation and a least a minimal copy of the state (as + // returned by Instruction::exception_state()) for debug info + // generation (that is when Instruction::needs_exception_state() + // returns true) then use copy_state_for_exception* + + ValueStack* copy_state_before_with_bci(int bci); + ValueStack* copy_state_before(); + ValueStack* copy_state_exhandling_with_bci(int bci); + ValueStack* copy_state_exhandling(); + ValueStack* copy_state_for_exception_with_bci(int bci); + ValueStack* copy_state_for_exception(); // // Inlining support @@ -292,9 +298,7 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { // accessors bool parsing_jsr() const { return scope_data()->parsing_jsr(); } BlockBegin* continuation() const { return scope_data()->continuation(); } - ValueStack* continuation_state() const { return scope_data()->continuation_state(); } BlockBegin* jsr_continuation() const { return scope_data()->jsr_continuation(); } - int caller_stack_size() const { return scope_data()->caller_stack_size(); } void set_continuation(BlockBegin* continuation) { scope_data()->set_continuation(continuation); } void set_inline_cleanup_info(BlockBegin* block, Instruction* return_prev, diff --git a/hotspot/src/share/vm/c1/c1_IR.cpp b/hotspot/src/share/vm/c1/c1_IR.cpp index cb5e2098ece..d916f04ffc6 100644 --- a/hotspot/src/share/vm/c1/c1_IR.cpp +++ b/hotspot/src/share/vm/c1/c1_IR.cpp @@ -116,24 +116,6 @@ bool XHandler::equals(XHandler* other) const { // Implementation of IRScope - -BlockBegin* IRScope::header_block(BlockBegin* entry, BlockBegin::Flag f, ValueStack* state) { - if (entry == NULL) return NULL; - assert(entry->is_set(f), "entry/flag mismatch"); - // create header block - BlockBegin* h = new BlockBegin(entry->bci()); - BlockEnd* g = new Goto(entry, false); - h->set_next(g, entry->bci()); - h->set_end(g); - h->set(f); - // setup header block end state - ValueStack* s = state->copy(); // can use copy since stack is empty (=> no phis) - assert(s->stack_is_empty(), "must have empty stack at entry point"); - g->set_state(s); - return h; -} - - BlockBegin* IRScope::build_graph(Compilation* compilation, int osr_bci) { GraphBuilder gm(compilation, this); NOT_PRODUCT(if (PrintValueNumbering && Verbose) gm.print_stats()); @@ -145,12 +127,9 @@ BlockBegin* IRScope::build_graph(Compilation* compilation, int osr_bci) { IRScope::IRScope(Compilation* compilation, IRScope* caller, int caller_bci, ciMethod* method, int osr_bci, bool create_graph) : _callees(2) , _compilation(compilation) -, _lock_stack_size(-1) , _requires_phi_function(method->max_locals()) { _caller = caller; - _caller_bci = caller == NULL ? -1 : caller_bci; - _caller_state = NULL; // Must be set later if needed _level = caller == NULL ? 0 : caller->level() + 1; _method = method; _xhandlers = new XHandlers(method); @@ -182,32 +161,6 @@ int IRScope::max_stack() const { } -void IRScope::compute_lock_stack_size() { - if (!InlineMethodsWithExceptionHandlers) { - _lock_stack_size = 0; - return; - } - - // Figure out whether we have to preserve expression stack elements - // for parent scopes, and if so, how many - IRScope* cur_scope = this; - while (cur_scope != NULL && !cur_scope->xhandlers()->has_handlers()) { - cur_scope = cur_scope->caller(); - } - _lock_stack_size = (cur_scope == NULL ? 0 : - (cur_scope->caller_state() == NULL ? 0 : - cur_scope->caller_state()->stack_size())); -} - -int IRScope::top_scope_bci() const { - assert(!is_top_scope(), "no correct answer for top scope possible"); - const IRScope* scope = this; - while (!scope->caller()->is_top_scope()) { - scope = scope->caller(); - } - return scope->caller_bci(); -} - bool IRScopeDebugInfo::should_reexecute() { ciMethod* cur_method = scope()->method(); int cur_bci = bci(); @@ -222,37 +175,24 @@ bool IRScopeDebugInfo::should_reexecute() { // Implementation of CodeEmitInfo // Stack must be NON-null -CodeEmitInfo::CodeEmitInfo(int bci, ValueStack* stack, XHandlers* exception_handlers) +CodeEmitInfo::CodeEmitInfo(ValueStack* stack, XHandlers* exception_handlers) : _scope(stack->scope()) - , _bci(bci) , _scope_debug_info(NULL) , _oop_map(NULL) , _stack(stack) , _exception_handlers(exception_handlers) - , _next(NULL) - , _id(-1) , _is_method_handle_invoke(false) { assert(_stack != NULL, "must be non null"); - assert(_bci == SynchronizationEntryBCI || Bytecodes::is_defined(scope()->method()->java_code_at_bci(_bci)), "make sure bci points at a real bytecode"); } -CodeEmitInfo::CodeEmitInfo(CodeEmitInfo* info, bool lock_stack_only) +CodeEmitInfo::CodeEmitInfo(CodeEmitInfo* info, ValueStack* stack) : _scope(info->_scope) , _exception_handlers(NULL) - , _bci(info->_bci) , _scope_debug_info(NULL) , _oop_map(NULL) + , _stack(stack == NULL ? info->_stack : stack) , _is_method_handle_invoke(info->_is_method_handle_invoke) { - if (lock_stack_only) { - if (info->_stack != NULL) { - _stack = info->_stack->copy_locks(); - } else { - _stack = NULL; - } - } else { - _stack = info->_stack; - } // deep copy of exception handlers if (info->_exception_handlers != NULL) { @@ -273,8 +213,6 @@ void CodeEmitInfo::add_register_oop(LIR_Opr opr) { assert(_oop_map != NULL, "oop map must already exist"); assert(opr->is_single_cpu(), "should not call otherwise"); - int frame_size = frame_map()->framesize(); - int arg_count = frame_map()->oop_map_arg_count(); VMReg name = frame_map()->regname(opr); _oop_map->set_oop(name); } @@ -383,8 +321,7 @@ class UseCountComputer: public ValueVisitor, BlockClosure { void visit(Value* n) { // Local instructions and Phis for expression stack values at the // start of basic blocks are not added to the instruction list - if ((*n)->bci() == -99 && (*n)->as_Local() == NULL && - (*n)->as_Phi() == NULL) { + if (!(*n)->is_linked()&& (*n)->can_be_linked()) { assert(false, "a node was not appended to the graph"); Compilation::current()->bailout("a node was not appended to the graph"); } @@ -1338,7 +1275,7 @@ void SubstitutionResolver::block_do(BlockBegin* block) { // need to remove this instruction from the instruction stream if (n->subst() != n) { assert(last != NULL, "must have last"); - last->set_next(n->next(), n->next()->bci()); + last->set_next(n->next()); } else { last = n; } diff --git a/hotspot/src/share/vm/c1/c1_IR.hpp b/hotspot/src/share/vm/c1/c1_IR.hpp index 05ef1789f85..35204c21f8e 100644 --- a/hotspot/src/share/vm/c1/c1_IR.hpp +++ b/hotspot/src/share/vm/c1/c1_IR.hpp @@ -132,8 +132,6 @@ class IRScope: public CompilationResourceObj { // hierarchy Compilation* _compilation; // the current compilation IRScope* _caller; // the caller scope, or NULL - int _caller_bci; // the caller bci of the corresponding (inlined) invoke, or < 0 - ValueStack* _caller_state; // the caller state, or NULL int _level; // the inlining level ciMethod* _method; // the corresponding method IRScopeList _callees; // the inlined method scopes @@ -144,15 +142,9 @@ class IRScope: public CompilationResourceObj { bool _monitor_pairing_ok; // the monitor pairing info BlockBegin* _start; // the start block, successsors are method entries - // lock stack management - int _lock_stack_size; // number of expression stack elements which, if present, - // must be spilled to the stack because of exception - // handling inside inlined methods - BitMap _requires_phi_function; // bit is set if phi functions at loop headers are necessary for a local variable // helper functions - BlockBegin* header_block(BlockBegin* entry, BlockBegin::Flag f, ValueStack* state); BlockBegin* build_graph(Compilation* compilation, int osr_bci); public: @@ -162,33 +154,16 @@ class IRScope: public CompilationResourceObj { // accessors Compilation* compilation() const { return _compilation; } IRScope* caller() const { return _caller; } - int caller_bci() const { return _caller_bci; } - ValueStack* caller_state() const { return _caller_state; } int level() const { return _level; } ciMethod* method() const { return _method; } int max_stack() const; // NOTE: expensive - int lock_stack_size() const { - assert(_lock_stack_size != -1, "uninitialized"); - return _lock_stack_size; - } BitMap& requires_phi_function() { return _requires_phi_function; } - // mutators - // Needed because caller state is not ready at time of IRScope construction - void set_caller_state(ValueStack* state) { _caller_state = state; } - // Needed because caller state changes after IRScope construction. - // Computes number of expression stack elements whose state must be - // preserved in the case of an exception; these may be seen by - // caller scopes. Zero when inlining of methods containing exception - // handlers is disabled, otherwise a conservative approximation. - void compute_lock_stack_size(); - // hierarchy bool is_top_scope() const { return _caller == NULL; } void add_callee(IRScope* callee) { _callees.append(callee); } int number_of_callees() const { return _callees.length(); } IRScope* callee_no(int i) const { return _callees.at(i); } - int top_scope_bci() const; // accessors, graph bool is_valid() const { return start() != NULL; } @@ -266,9 +241,6 @@ class CodeEmitInfo: public CompilationResourceObj { XHandlers* _exception_handlers; OopMap* _oop_map; ValueStack* _stack; // used by deoptimization (contains also monitors - int _bci; - CodeEmitInfo* _next; - int _id; bool _is_method_handle_invoke; // true if the associated call site is a MethodHandle call site. FrameMap* frame_map() const { return scope()->compilation()->frame_map(); } @@ -277,23 +249,10 @@ class CodeEmitInfo: public CompilationResourceObj { public: // use scope from ValueStack - CodeEmitInfo(int bci, ValueStack* stack, XHandlers* exception_handlers); - - // used by natives - CodeEmitInfo(IRScope* scope, int bci) - : _scope(scope) - , _bci(bci) - , _oop_map(NULL) - , _scope_debug_info(NULL) - , _stack(NULL) - , _exception_handlers(NULL) - , _next(NULL) - , _id(-1) - , _is_method_handle_invoke(false) { - } + CodeEmitInfo(ValueStack* stack, XHandlers* exception_handlers); // make a copy - CodeEmitInfo(CodeEmitInfo* info, bool lock_stack_only = false); + CodeEmitInfo(CodeEmitInfo* info, ValueStack* stack = NULL); // accessors OopMap* oop_map() { return _oop_map; } @@ -301,17 +260,10 @@ class CodeEmitInfo: public CompilationResourceObj { IRScope* scope() const { return _scope; } XHandlers* exception_handlers() const { return _exception_handlers; } ValueStack* stack() const { return _stack; } - int bci() const { return _bci; } void add_register_oop(LIR_Opr opr); void record_debug_info(DebugInformationRecorder* recorder, int pc_offset); - CodeEmitInfo* next() const { return _next; } - void set_next(CodeEmitInfo* next) { _next = next; } - - int id() const { return _id; } - void set_id(int id) { _id = id; } - bool is_method_handle_invoke() const { return _is_method_handle_invoke; } void set_is_method_handle_invoke(bool x) { _is_method_handle_invoke = x; } }; diff --git a/hotspot/src/share/vm/c1/c1_Instruction.cpp b/hotspot/src/share/vm/c1/c1_Instruction.cpp index e0728b2f304..14c834d1f42 100644 --- a/hotspot/src/share/vm/c1/c1_Instruction.cpp +++ b/hotspot/src/share/vm/c1/c1_Instruction.cpp @@ -29,13 +29,6 @@ // Implementation of Instruction -#ifdef ASSERT -void Instruction::create_hi_word() { - assert(type()->is_double_word() && _hi_word == NULL, "only double word has high word"); - _hi_word = new HiWord(this); -} -#endif - Instruction::Condition Instruction::mirror(Condition cond) { switch (cond) { case eql: return eql; @@ -63,6 +56,15 @@ Instruction::Condition Instruction::negate(Condition cond) { return eql; } +void Instruction::update_exception_state(ValueStack* state) { + if (state != NULL && (state->kind() == ValueStack::EmptyExceptionState || state->kind() == ValueStack::ExceptionState)) { + assert(state->kind() == ValueStack::EmptyExceptionState || Compilation::current()->env()->jvmti_can_access_local_variables(), "unexpected state kind"); + _exception_state = state; + } else { + _exception_state = NULL; + } +} + Instruction* Instruction::prev(BlockBegin* block) { Instruction* p = NULL; @@ -75,7 +77,24 @@ Instruction* Instruction::prev(BlockBegin* block) { } +void Instruction::state_values_do(ValueVisitor* f) { + if (state_before() != NULL) { + state_before()->values_do(f); + } + if (exception_state() != NULL){ + exception_state()->values_do(f); + } +} + + #ifndef PRODUCT +void Instruction::check_state(ValueStack* state) { + if (state != NULL) { + state->verify(); + } +} + + void Instruction::print() { InstructionPrinter ip; print(ip); @@ -190,35 +209,6 @@ ciType* CheckCast::exact_type() const { return NULL; } - -void ArithmeticOp::other_values_do(ValueVisitor* f) { - if (lock_stack() != NULL) lock_stack()->values_do(f); -} - -void NullCheck::other_values_do(ValueVisitor* f) { - lock_stack()->values_do(f); -} - -void AccessArray::other_values_do(ValueVisitor* f) { - if (lock_stack() != NULL) lock_stack()->values_do(f); -} - - -// Implementation of AccessField - -void AccessField::other_values_do(ValueVisitor* f) { - if (state_before() != NULL) state_before()->values_do(f); - if (lock_stack() != NULL) lock_stack()->values_do(f); -} - - -// Implementation of StoreIndexed - -IRScope* StoreIndexed::scope() const { - return lock_stack()->scope(); -} - - // Implementation of ArithmeticOp bool ArithmeticOp::is_commutative() const { @@ -266,13 +256,6 @@ bool LogicOp::is_commutative() const { } -// Implementation of CompareOp - -void CompareOp::other_values_do(ValueVisitor* f) { - if (state_before() != NULL) state_before()->values_do(f); -} - - // Implementation of IfOp bool IfOp::is_commutative() const { @@ -301,6 +284,7 @@ IRScope* StateSplit::scope() const { void StateSplit::state_values_do(ValueVisitor* f) { + Instruction::state_values_do(f); if (state() != NULL) state()->values_do(f); } @@ -316,30 +300,17 @@ void BlockBegin::state_values_do(ValueVisitor* f) { } -void MonitorEnter::state_values_do(ValueVisitor* f) { - StateSplit::state_values_do(f); - _lock_stack_before->values_do(f); -} - - -void Intrinsic::state_values_do(ValueVisitor* f) { - StateSplit::state_values_do(f); - if (lock_stack() != NULL) lock_stack()->values_do(f); -} - - // Implementation of Invoke Invoke::Invoke(Bytecodes::Code code, ValueType* result_type, Value recv, Values* args, int vtable_index, ciMethod* target, ValueStack* state_before) - : StateSplit(result_type) + : StateSplit(result_type, state_before) , _code(code) , _recv(recv) , _args(args) , _vtable_index(vtable_index) , _target(target) - , _state_before(state_before) { set_flag(TargetIsLoadedFlag, target->is_loaded()); set_flag(TargetIsFinalFlag, target_is_loaded() && target->is_final_method()); @@ -376,7 +347,7 @@ void Invoke::state_values_do(ValueVisitor* f) { // Implementation of Contant intx Constant::hash() const { - if (_state == NULL) { + if (state_before() == NULL) { switch (type()->tag()) { case intTag: return HASH2(name(), type()->as_IntConstant()->value()); @@ -499,25 +470,6 @@ BlockBegin* Constant::compare(Instruction::Condition cond, Value right, } -void Constant::other_values_do(ValueVisitor* f) { - if (state() != NULL) state()->values_do(f); -} - - -// Implementation of NewArray - -void NewArray::other_values_do(ValueVisitor* f) { - if (state_before() != NULL) state_before()->values_do(f); -} - - -// Implementation of TypeCheck - -void TypeCheck::other_values_do(ValueVisitor* f) { - if (state_before() != NULL) state_before()->values_do(f); -} - - // Implementation of BlockBegin void BlockBegin::set_end(BlockEnd* end) { @@ -604,23 +556,14 @@ void BlockBegin::substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux) { // of the inserted block, without recomputing the values of the other blocks // in the CFG. Therefore the value of "depth_first_number" in BlockBegin becomes meaningless. BlockBegin* BlockBegin::insert_block_between(BlockBegin* sux) { - // Try to make the bci close to a block with a single pred or sux, - // since this make the block layout algorithm work better. - int bci = -1; - if (sux->number_of_preds() == 1) { - bci = sux->bci(); - } else { - bci = end()->bci(); - } - - BlockBegin* new_sux = new BlockBegin(bci); + BlockBegin* new_sux = new BlockBegin(-99); // mark this block (special treatment when block order is computed) new_sux->set(critical_edge_split_flag); // This goto is not a safepoint. Goto* e = new Goto(sux, false); - new_sux->set_next(e, bci); + new_sux->set_next(e, end()->state()->bci()); new_sux->set_end(e); // setup states ValueStack* s = end()->state(); @@ -763,7 +706,7 @@ bool BlockBegin::try_merge(ValueStack* new_state) { } // copy state because it is altered - new_state = new_state->copy(); + new_state = new_state->copy(ValueStack::BlockBeginState, bci()); // Use method liveness to invalidate dead locals MethodLivenessResult liveness = new_state->scope()->method()->liveness_at_bci(bci()); @@ -800,19 +743,9 @@ bool BlockBegin::try_merge(ValueStack* new_state) { // initialize state of block set_state(new_state); - } else if (existing_state->is_same_across_scopes(new_state)) { + } else if (existing_state->is_same(new_state)) { TRACE_PHI(tty->print_cr("exisiting state found")); - // Inlining may cause the local state not to match up, so walk up - // the new state until we get to the same scope as the - // existing and then start processing from there. - while (existing_state->scope() != new_state->scope()) { - new_state = new_state->caller_state(); - assert(new_state != NULL, "could not match up scopes"); - - assert(false, "check if this is necessary"); - } - assert(existing_state->scope() == new_state->scope(), "not matching"); assert(existing_state->locals_size() == new_state->locals_size(), "not matching"); assert(existing_state->stack_size() == new_state->stack_size(), "not matching"); @@ -969,11 +902,6 @@ void BlockEnd::substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux) { } -void BlockEnd::other_values_do(ValueVisitor* f) { - if (state_before() != NULL) state_before()->values_do(f); -} - - // Implementation of Phi // Normal phi functions take their operands from the last instruction of the @@ -1006,11 +934,6 @@ int Phi::operand_count() const { } -// Implementation of Throw - -void Throw::state_values_do(ValueVisitor* f) { - BlockEnd::state_values_do(f); -} void ProfileInvoke::state_values_do(ValueVisitor* f) { if (state() != NULL) state()->values_do(f); diff --git a/hotspot/src/share/vm/c1/c1_Instruction.hpp b/hotspot/src/share/vm/c1/c1_Instruction.hpp index 52b2f84a76f..9f0a25ab38d 100644 --- a/hotspot/src/share/vm/c1/c1_Instruction.hpp +++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp @@ -38,7 +38,6 @@ typedef LIR_OprDesc* LIR_Opr; // serve factoring. class Instruction; -class HiWord; class Phi; class Local; class Constant; @@ -149,7 +148,6 @@ class BlockList: public _BlockList { class InstructionVisitor: public StackObj { public: - void do_HiWord (HiWord* x) { ShouldNotReachHere(); } virtual void do_Phi (Phi* x) = 0; virtual void do_Local (Local* x) = 0; virtual void do_Constant (Constant* x) = 0; @@ -272,7 +270,9 @@ class InstructionVisitor: public StackObj { class Instruction: public CompilationResourceObj { private: int _id; // the unique instruction id - int _bci; // the instruction bci +#ifndef PRODUCT + int _printable_bci; // the bci of the instruction for printing +#endif int _use_count; // the number of instructions refering to this value (w/o prev/next); only roots can have use count = 0 or > 1 int _pin_state; // set of PinReason describing the reason for pinning ValueType* _type; // the instruction value type @@ -281,17 +281,18 @@ class Instruction: public CompilationResourceObj { LIR_Opr _operand; // LIR specific information unsigned int _flags; // Flag bits + ValueStack* _state_before; // Copy of state with input operands still on stack (or NULL) + ValueStack* _exception_state; // Copy of state for exception handling XHandlers* _exception_handlers; // Flat list of exception handlers covering this instruction -#ifdef ASSERT - HiWord* _hi_word; -#endif - friend class UseCountComputer; friend class BlockBegin; + void update_exception_state(ValueStack* state); + + bool has_printable_bci() const { return NOT_PRODUCT(_printable_bci != -99) PRODUCT_ONLY(false); } + protected: - void set_bci(int bci) { assert(bci == SynchronizationEntryBCI || bci >= 0, "illegal bci"); _bci = bci; } void set_type(ValueType* type) { assert(type != NULL, "type must exist"); _type = type; @@ -325,6 +326,7 @@ class Instruction: public CompilationResourceObj { NeedsPatchingFlag, ThrowIncompatibleClassChangeErrorFlag, ProfileMDOFlag, + IsLinkedInBlockFlag, InstructionLastFlag }; @@ -356,31 +358,31 @@ class Instruction: public CompilationResourceObj { } // creation - Instruction(ValueType* type, bool type_is_constant = false, bool create_hi = true) - : _bci(-99) - , _use_count(0) + Instruction(ValueType* type, ValueStack* state_before = NULL, bool type_is_constant = false, bool create_hi = true) + : _use_count(0) +#ifndef PRODUCT + , _printable_bci(-99) +#endif , _pin_state(0) , _type(type) , _next(NULL) , _subst(NULL) , _flags(0) , _operand(LIR_OprFact::illegalOpr) + , _state_before(state_before) , _exception_handlers(NULL) -#ifdef ASSERT - , _hi_word(NULL) -#endif { + check_state(state_before); assert(type != NULL && (!type->is_constant() || type_is_constant), "type must exist"); -#ifdef ASSERT - if (create_hi && type->is_double_word()) { - create_hi_word(); - } -#endif + update_exception_state(_state_before); } // accessors int id() const { return _id; } - int bci() const { return _bci; } +#ifndef PRODUCT + int printable_bci() const { assert(has_printable_bci(), "_printable_bci should have been set"); return _printable_bci; } + void set_printable_bci(int bci) { NOT_PRODUCT(_printable_bci = bci;) } +#endif int use_count() const { return _use_count; } int pin_state() const { return _pin_state; } bool is_pinned() const { return _pin_state != 0 || PinAllInstructions; } @@ -393,9 +395,13 @@ class Instruction: public CompilationResourceObj { void set_needs_null_check(bool f) { set_flag(NeedsNullCheckFlag, f); } bool needs_null_check() const { return check_flag(NeedsNullCheckFlag); } + bool is_linked() const { return check_flag(IsLinkedInBlockFlag); } + bool can_be_linked() { return as_Local() == NULL && as_Phi() == NULL; } bool has_uses() const { return use_count() > 0; } - bool is_root() const { return is_pinned() || use_count() > 1; } + ValueStack* state_before() const { return _state_before; } + ValueStack* exception_state() const { return _exception_state; } + virtual bool needs_exception_state() const { return true; } XHandlers* exception_handlers() const { return _exception_handlers; } // manipulation @@ -403,19 +409,25 @@ class Instruction: public CompilationResourceObj { void pin() { _pin_state |= PinUnknown; } // DANGEROUS: only used by EliminateStores void unpin(PinReason reason) { assert((reason & PinUnknown) == 0, "can't unpin unknown state"); _pin_state &= ~reason; } - virtual void set_lock_stack(ValueStack* l) { /* do nothing*/ } - virtual ValueStack* lock_stack() const { return NULL; } - Instruction* set_next(Instruction* next, int bci) { - if (next != NULL) { - assert(as_BlockEnd() == NULL, "BlockEnd instructions must have no next"); - assert(next->as_Phi() == NULL && next->as_Local() == NULL, "shouldn't link these instructions into list"); - next->set_bci(bci); - } + Instruction* set_next(Instruction* next) { + assert(next->has_printable_bci(), "_printable_bci should have been set"); + assert(next != NULL, "must not be NULL"); + assert(as_BlockEnd() == NULL, "BlockEnd instructions must have no next"); + assert(next->can_be_linked(), "shouldn't link these instructions into list"); + + next->set_flag(Instruction::IsLinkedInBlockFlag, true); _next = next; return next; } + Instruction* set_next(Instruction* next, int bci) { +#ifndef PRODUCT + next->set_printable_bci(bci); +#endif + return set_next(next); + } + void set_subst(Instruction* subst) { assert(subst == NULL || type()->base() == subst->type()->base() || @@ -423,14 +435,7 @@ class Instruction: public CompilationResourceObj { _subst = subst; } void set_exception_handlers(XHandlers *xhandlers) { _exception_handlers = xhandlers; } - -#ifdef ASSERT - // HiWord is used for debugging and is allocated early to avoid - // allocation at inconvenient points - HiWord* hi_word() { return _hi_word; } - void create_hi_word(); -#endif - + void set_exception_state(ValueStack* s) { check_state(s); _exception_state = s; } // machine-specifics void set_operand(LIR_Opr operand) { assert(operand != LIR_OprFact::illegalOpr, "operand must exist"); _operand = operand; } @@ -438,7 +443,6 @@ class Instruction: public CompilationResourceObj { // generic virtual Instruction* as_Instruction() { return this; } // to satisfy HASHING1 macro - virtual HiWord* as_HiWord() { return NULL; } virtual Phi* as_Phi() { return NULL; } virtual Local* as_Local() { return NULL; } virtual Constant* as_Constant() { return NULL; } @@ -493,7 +497,7 @@ class Instruction: public CompilationResourceObj { virtual bool can_trap() const { return false; } virtual void input_values_do(ValueVisitor* f) = 0; - virtual void state_values_do(ValueVisitor* f) { /* usually no state - override on demand */ } + virtual void state_values_do(ValueVisitor* f); virtual void other_values_do(ValueVisitor* f) { /* usually no other - override on demand */ } void values_do(ValueVisitor* f) { input_values_do(f); state_values_do(f); other_values_do(f); } @@ -505,6 +509,7 @@ class Instruction: public CompilationResourceObj { HASHING1(Instruction, false, id()) // hashing disabled by default // debugging + static void check_state(ValueStack* state) PRODUCT_RETURN; void print() PRODUCT_RETURN; void print_line() PRODUCT_RETURN; void print(InstructionPrinter& ip) PRODUCT_RETURN; @@ -541,40 +546,6 @@ class AssertValues: public ValueVisitor { #endif // ASSERT -// A HiWord occupies the 'high word' of a 2-word -// expression stack entry. Hi & lo words must be -// paired on the expression stack (otherwise the -// bytecode sequence is illegal). Note that 'hi' -// refers to the IR expression stack format and -// does *not* imply a machine word ordering. No -// HiWords are used in optimized mode for speed, -// but NULL pointers are used instead. - -LEAF(HiWord, Instruction) - private: - Value _lo_word; - - public: - // creation - HiWord(Value lo_word) - : Instruction(illegalType, false, false), - _lo_word(lo_word) { - // hi-words are also allowed for illegal lo-words - assert(lo_word->type()->is_double_word() || lo_word->type()->is_illegal(), - "HiWord must be used for 2-word values only"); - } - - // accessors - Value lo_word() const { return _lo_word->subst(); } - - // for invalidating of HiWords - void make_illegal() { set_type(illegalType); } - - // generic - virtual void input_values_do(ValueVisitor* f) { ShouldNotReachHere(); } -}; - - // A Phi is a phi function in the sense of SSA form. It stands for // the value of a local variable at the beginning of a join block. // A Phi consists of n operands, one for every incoming branch. @@ -656,31 +627,25 @@ LEAF(Local, Instruction) LEAF(Constant, Instruction) - ValueStack* _state; - public: // creation Constant(ValueType* type): - Instruction(type, true) - , _state(NULL) { + Instruction(type, NULL, true) + { assert(type->is_constant(), "must be a constant"); } - Constant(ValueType* type, ValueStack* state): - Instruction(type, true) - , _state(state) { - assert(state != NULL, "only used for constants which need patching"); + Constant(ValueType* type, ValueStack* state_before): + Instruction(type, state_before, true) + { + assert(state_before != NULL, "only used for constants which need patching"); assert(type->is_constant(), "must be a constant"); // since it's patching it needs to be pinned pin(); } - ValueStack* state() const { return _state; } - - // generic - virtual bool can_trap() const { return state() != NULL; } + virtual bool can_trap() const { return state_before() != NULL; } virtual void input_values_do(ValueVisitor* f) { /* no values */ } - virtual void other_values_do(ValueVisitor* f); virtual intx hash() const; virtual bool is_equal(Value v) const; @@ -695,20 +660,16 @@ BASE(AccessField, Instruction) Value _obj; int _offset; ciField* _field; - ValueStack* _state_before; // state is set only for unloaded or uninitialized fields - ValueStack* _lock_stack; // contains lock and scope information NullCheck* _explicit_null_check; // For explicit null check elimination public: // creation - AccessField(Value obj, int offset, ciField* field, bool is_static, ValueStack* lock_stack, + AccessField(Value obj, int offset, ciField* field, bool is_static, ValueStack* state_before, bool is_loaded, bool is_initialized) - : Instruction(as_ValueType(field->type()->basic_type())) + : Instruction(as_ValueType(field->type()->basic_type()), state_before) , _obj(obj) , _offset(offset) , _field(field) - , _lock_stack(lock_stack) - , _state_before(state_before) , _explicit_null_check(NULL) { set_needs_null_check(!is_static); @@ -734,13 +695,11 @@ BASE(AccessField, Instruction) bool is_static() const { return check_flag(IsStaticFlag); } bool is_loaded() const { return check_flag(IsLoadedFlag); } bool is_initialized() const { return check_flag(IsInitializedFlag); } - ValueStack* state_before() const { return _state_before; } - ValueStack* lock_stack() const { return _lock_stack; } NullCheck* explicit_null_check() const { return _explicit_null_check; } bool needs_patching() const { return check_flag(NeedsPatchingFlag); } // manipulation - void set_lock_stack(ValueStack* l) { _lock_stack = l; } + // Under certain circumstances, if a previous NullCheck instruction // proved the target object non-null, we can eliminate the explicit // null check and do an implicit one, simply specifying the debug @@ -751,16 +710,15 @@ BASE(AccessField, Instruction) // generic virtual bool can_trap() const { return needs_null_check() || needs_patching(); } virtual void input_values_do(ValueVisitor* f) { f->visit(&_obj); } - virtual void other_values_do(ValueVisitor* f); }; LEAF(LoadField, AccessField) public: // creation - LoadField(Value obj, int offset, ciField* field, bool is_static, ValueStack* lock_stack, + LoadField(Value obj, int offset, ciField* field, bool is_static, ValueStack* state_before, bool is_loaded, bool is_initialized) - : AccessField(obj, offset, field, is_static, lock_stack, state_before, is_loaded, is_initialized) + : AccessField(obj, offset, field, is_static, state_before, is_loaded, is_initialized) {} ciType* declared_type() const; @@ -777,9 +735,9 @@ LEAF(StoreField, AccessField) public: // creation - StoreField(Value obj, int offset, ciField* field, Value value, bool is_static, ValueStack* lock_stack, + StoreField(Value obj, int offset, ciField* field, Value value, bool is_static, ValueStack* state_before, bool is_loaded, bool is_initialized) - : AccessField(obj, offset, field, is_static, lock_stack, state_before, is_loaded, is_initialized) + : AccessField(obj, offset, field, is_static, state_before, is_loaded, is_initialized) , _value(value) { set_flag(NeedsWriteBarrierFlag, as_ValueType(field_type())->is_object()); @@ -799,29 +757,23 @@ LEAF(StoreField, AccessField) BASE(AccessArray, Instruction) private: Value _array; - ValueStack* _lock_stack; public: // creation - AccessArray(ValueType* type, Value array, ValueStack* lock_stack) - : Instruction(type) + AccessArray(ValueType* type, Value array, ValueStack* state_before) + : Instruction(type, state_before) , _array(array) - , _lock_stack(lock_stack) { + { set_needs_null_check(true); ASSERT_VALUES pin(); // instruction with side effect (null exception or range check throwing) } Value array() const { return _array; } - ValueStack* lock_stack() const { return _lock_stack; } - - // setters - void set_lock_stack(ValueStack* l) { _lock_stack = l; } // generic virtual bool can_trap() const { return needs_null_check(); } virtual void input_values_do(ValueVisitor* f) { f->visit(&_array); } - virtual void other_values_do(ValueVisitor* f); }; @@ -831,8 +783,8 @@ LEAF(ArrayLength, AccessArray) public: // creation - ArrayLength(Value array, ValueStack* lock_stack) - : AccessArray(intType, array, lock_stack) + ArrayLength(Value array, ValueStack* state_before) + : AccessArray(intType, array, state_before) , _explicit_null_check(NULL) {} // accessors @@ -855,8 +807,8 @@ BASE(AccessIndexed, AccessArray) public: // creation - AccessIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* lock_stack) - : AccessArray(as_ValueType(elt_type), array, lock_stack) + AccessIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* state_before) + : AccessArray(as_ValueType(elt_type), array, state_before) , _index(index) , _length(length) , _elt_type(elt_type) @@ -883,8 +835,8 @@ LEAF(LoadIndexed, AccessIndexed) public: // creation - LoadIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* lock_stack) - : AccessIndexed(array, index, length, elt_type, lock_stack) + LoadIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* state_before) + : AccessIndexed(array, index, length, elt_type, state_before) , _explicit_null_check(NULL) {} // accessors @@ -910,8 +862,8 @@ LEAF(StoreIndexed, AccessIndexed) int _profiled_bci; public: // creation - StoreIndexed(Value array, Value index, Value length, BasicType elt_type, Value value, ValueStack* lock_stack) - : AccessIndexed(array, index, length, elt_type, lock_stack) + StoreIndexed(Value array, Value index, Value length, BasicType elt_type, Value value, ValueStack* state_before) + : AccessIndexed(array, index, length, elt_type, state_before) , _value(value), _profiled_method(NULL), _profiled_bci(0) { set_flag(NeedsWriteBarrierFlag, (as_ValueType(elt_type)->is_object())); @@ -922,7 +874,6 @@ LEAF(StoreIndexed, AccessIndexed) // accessors Value value() const { return _value; } - IRScope* scope() const; // the state's scope bool needs_write_barrier() const { return check_flag(NeedsWriteBarrierFlag); } bool needs_store_check() const { return check_flag(NeedsStoreCheckFlag); } // Helpers for methodDataOop profiling @@ -963,7 +914,12 @@ BASE(Op2, Instruction) public: // creation - Op2(ValueType* type, Bytecodes::Code op, Value x, Value y) : Instruction(type), _op(op), _x(x), _y(y) { + Op2(ValueType* type, Bytecodes::Code op, Value x, Value y, ValueStack* state_before = NULL) + : Instruction(type, state_before) + , _op(op) + , _x(x) + , _y(y) + { ASSERT_VALUES } @@ -985,28 +941,21 @@ BASE(Op2, Instruction) LEAF(ArithmeticOp, Op2) - private: - ValueStack* _lock_stack; // used only for division operations public: // creation - ArithmeticOp(Bytecodes::Code op, Value x, Value y, bool is_strictfp, ValueStack* lock_stack) - : Op2(x->type()->meet(y->type()), op, x, y) - , _lock_stack(lock_stack) { + ArithmeticOp(Bytecodes::Code op, Value x, Value y, bool is_strictfp, ValueStack* state_before) + : Op2(x->type()->meet(y->type()), op, x, y, state_before) + { set_flag(IsStrictfpFlag, is_strictfp); if (can_trap()) pin(); } // accessors - ValueStack* lock_stack() const { return _lock_stack; } bool is_strictfp() const { return check_flag(IsStrictfpFlag); } - // setters - void set_lock_stack(ValueStack* l) { _lock_stack = l; } - // generic virtual bool is_commutative() const; virtual bool can_trap() const; - virtual void other_values_do(ValueVisitor* f); HASHING3(Op2, true, op(), x()->subst(), y()->subst()) }; @@ -1033,21 +982,14 @@ LEAF(LogicOp, Op2) LEAF(CompareOp, Op2) - private: - ValueStack* _state_before; // for deoptimization, when canonicalizing public: // creation CompareOp(Bytecodes::Code op, Value x, Value y, ValueStack* state_before) - : Op2(intType, op, x, y) - , _state_before(state_before) + : Op2(intType, op, x, y, state_before) {} - // accessors - ValueStack* state_before() const { return _state_before; } - // generic HASHING3(Op2, true, op(), x()->subst(), y()->subst()) - virtual void other_values_do(ValueVisitor* f); }; @@ -1103,11 +1045,13 @@ LEAF(Convert, Instruction) LEAF(NullCheck, Instruction) private: Value _obj; - ValueStack* _lock_stack; public: // creation - NullCheck(Value obj, ValueStack* lock_stack) : Instruction(obj->type()->base()), _obj(obj), _lock_stack(lock_stack) { + NullCheck(Value obj, ValueStack* state_before) + : Instruction(obj->type()->base(), state_before) + , _obj(obj) + { ASSERT_VALUES set_can_trap(true); assert(_obj->type()->is_object(), "null check must be applied to objects only"); @@ -1116,16 +1060,13 @@ LEAF(NullCheck, Instruction) // accessors Value obj() const { return _obj; } - ValueStack* lock_stack() const { return _lock_stack; } // setters - void set_lock_stack(ValueStack* l) { _lock_stack = l; } void set_can_trap(bool can_trap) { set_flag(CanTrapFlag, can_trap); } // generic virtual bool can_trap() const { return check_flag(CanTrapFlag); /* null-check elimination sets to false */ } virtual void input_values_do(ValueVisitor* f) { f->visit(&_obj); } - virtual void other_values_do(ValueVisitor* f); HASHING1(NullCheck, true, obj()->subst()) }; @@ -1139,7 +1080,10 @@ BASE(StateSplit, Instruction) public: // creation - StateSplit(ValueType* type) : Instruction(type), _state(NULL) { + StateSplit(ValueType* type, ValueStack* state_before = NULL) + : Instruction(type, state_before) + , _state(NULL) + { pin(PinStateSplitConstructor); } @@ -1148,7 +1092,7 @@ BASE(StateSplit, Instruction) IRScope* scope() const; // the state's scope // manipulation - void set_state(ValueStack* state) { _state = state; } + void set_state(ValueStack* state) { assert(_state == NULL, "overwriting existing state"); check_state(state); _state = state; } // generic virtual void input_values_do(ValueVisitor* f) { /* no values */ } @@ -1164,7 +1108,6 @@ LEAF(Invoke, StateSplit) BasicTypeList* _signature; int _vtable_index; ciMethod* _target; - ValueStack* _state_before; // Required for deoptimization. public: // creation @@ -1180,7 +1123,6 @@ LEAF(Invoke, StateSplit) int vtable_index() const { return _vtable_index; } BasicTypeList* signature() const { return _signature; } ciMethod* target() const { return _target; } - ValueStack* state_before() const { return _state_before; } // Returns false if target is not loaded bool target_is_final() const { return check_flag(TargetIsFinalFlag); } @@ -1191,6 +1133,8 @@ LEAF(Invoke, StateSplit) // JSR 292 support bool is_invokedynamic() const { return code() == Bytecodes::_invokedynamic; } + virtual bool needs_exception_state() const { return false; } + // generic virtual bool can_trap() const { return true; } virtual void input_values_do(ValueVisitor* f) { @@ -1208,11 +1152,16 @@ LEAF(NewInstance, StateSplit) public: // creation - NewInstance(ciInstanceKlass* klass) : StateSplit(instanceType), _klass(klass) {} + NewInstance(ciInstanceKlass* klass, ValueStack* state_before) + : StateSplit(instanceType, state_before) + , _klass(klass) + {} // accessors ciInstanceKlass* klass() const { return _klass; } + virtual bool needs_exception_state() const { return false; } + // generic virtual bool can_trap() const { return true; } ciType* exact_type() const; @@ -1222,22 +1171,24 @@ LEAF(NewInstance, StateSplit) BASE(NewArray, StateSplit) private: Value _length; - ValueStack* _state_before; public: // creation - NewArray(Value length, ValueStack* state_before) : StateSplit(objectType), _length(length), _state_before(state_before) { + NewArray(Value length, ValueStack* state_before) + : StateSplit(objectType, state_before) + , _length(length) + { // Do not ASSERT_VALUES since length is NULL for NewMultiArray } // accessors - ValueStack* state_before() const { return _state_before; } Value length() const { return _length; } + virtual bool needs_exception_state() const { return false; } + // generic virtual bool can_trap() const { return true; } virtual void input_values_do(ValueVisitor* f) { StateSplit::input_values_do(f); f->visit(&_length); } - virtual void other_values_do(ValueVisitor* f); }; @@ -1247,7 +1198,10 @@ LEAF(NewTypeArray, NewArray) public: // creation - NewTypeArray(Value length, BasicType elt_type) : NewArray(length, NULL), _elt_type(elt_type) {} + NewTypeArray(Value length, BasicType elt_type, ValueStack* state_before) + : NewArray(length, state_before) + , _elt_type(elt_type) + {} // accessors BasicType elt_type() const { return _elt_type; } @@ -1303,7 +1257,6 @@ BASE(TypeCheck, StateSplit) private: ciKlass* _klass; Value _obj; - ValueStack* _state_before; ciMethod* _profiled_method; int _profiled_bci; @@ -1311,14 +1264,13 @@ BASE(TypeCheck, StateSplit) public: // creation TypeCheck(ciKlass* klass, Value obj, ValueType* type, ValueStack* state_before) - : StateSplit(type), _klass(klass), _obj(obj), _state_before(state_before), + : StateSplit(type, state_before), _klass(klass), _obj(obj), _profiled_method(NULL), _profiled_bci(0) { ASSERT_VALUES set_direct_compare(false); } // accessors - ValueStack* state_before() const { return _state_before; } ciKlass* klass() const { return _klass; } Value obj() const { return _obj; } bool is_loaded() const { return klass() != NULL; } @@ -1330,7 +1282,6 @@ BASE(TypeCheck, StateSplit) // generic virtual bool can_trap() const { return true; } virtual void input_values_do(ValueVisitor* f) { StateSplit::input_values_do(f); f->visit(&_obj); } - virtual void other_values_do(ValueVisitor* f); // Helpers for methodDataOop profiling void set_should_profile(bool value) { set_flag(ProfileMDOFlag, value); } @@ -1364,6 +1315,8 @@ LEAF(InstanceOf, TypeCheck) public: // creation InstanceOf(ciKlass* klass, Value obj, ValueStack* state_before) : TypeCheck(klass, obj, intType, state_before) {} + + virtual bool needs_exception_state() const { return false; } }; @@ -1374,8 +1327,8 @@ BASE(AccessMonitor, StateSplit) public: // creation - AccessMonitor(Value obj, int monitor_no) - : StateSplit(illegalType) + AccessMonitor(Value obj, int monitor_no, ValueStack* state_before = NULL) + : StateSplit(illegalType, state_before) , _obj(obj) , _monitor_no(monitor_no) { @@ -1393,22 +1346,14 @@ BASE(AccessMonitor, StateSplit) LEAF(MonitorEnter, AccessMonitor) - private: - ValueStack* _lock_stack_before; - public: // creation - MonitorEnter(Value obj, int monitor_no, ValueStack* lock_stack_before) - : AccessMonitor(obj, monitor_no) - , _lock_stack_before(lock_stack_before) + MonitorEnter(Value obj, int monitor_no, ValueStack* state_before) + : AccessMonitor(obj, monitor_no, state_before) { ASSERT_VALUES } - // accessors - ValueStack* lock_stack_before() const { return _lock_stack_before; } - virtual void state_values_do(ValueVisitor* f); - // generic virtual bool can_trap() const { return true; } }; @@ -1417,7 +1362,11 @@ LEAF(MonitorEnter, AccessMonitor) LEAF(MonitorExit, AccessMonitor) public: // creation - MonitorExit(Value obj, int monitor_no) : AccessMonitor(obj, monitor_no) {} + MonitorExit(Value obj, int monitor_no) + : AccessMonitor(obj, monitor_no, NULL) + { + ASSERT_VALUES + } }; @@ -1425,7 +1374,6 @@ LEAF(Intrinsic, StateSplit) private: vmIntrinsics::ID _id; Values* _args; - ValueStack* _lock_stack; Value _recv; public: @@ -1440,13 +1388,12 @@ LEAF(Intrinsic, StateSplit) vmIntrinsics::ID id, Values* args, bool has_receiver, - ValueStack* lock_stack, + ValueStack* state_before, bool preserves_state, bool cantrap = true) - : StateSplit(type) + : StateSplit(type, state_before) , _id(id) , _args(args) - , _lock_stack(lock_stack) , _recv(NULL) { assert(args != NULL, "args must exist"); @@ -1468,7 +1415,6 @@ LEAF(Intrinsic, StateSplit) vmIntrinsics::ID id() const { return _id; } int number_of_arguments() const { return _args->length(); } Value argument_at(int i) const { return _args->at(i); } - ValueStack* lock_stack() const { return _lock_stack; } bool has_receiver() const { return (_recv != NULL); } Value receiver() const { assert(has_receiver(), "must have receiver"); return _recv; } @@ -1480,8 +1426,6 @@ LEAF(Intrinsic, StateSplit) StateSplit::input_values_do(f); for (int i = 0; i < _args->length(); i++) f->visit(_args->adr_at(i)); } - virtual void state_values_do(ValueVisitor* f); - }; @@ -1490,6 +1434,7 @@ class LIR_List; LEAF(BlockBegin, StateSplit) private: int _block_id; // the unique block id + int _bci; // start-bci of block int _depth_first_number; // number of this block in a depth-first ordering int _linear_scan_number; // number of this block in linear-scan ordering int _loop_depth; // the loop nesting level of this block @@ -1546,6 +1491,7 @@ LEAF(BlockBegin, StateSplit) // creation BlockBegin(int bci) : StateSplit(illegalType) + , _bci(bci) , _depth_first_number(-1) , _linear_scan_number(-1) , _loop_depth(0) @@ -1570,11 +1516,14 @@ LEAF(BlockBegin, StateSplit) , _total_preds(0) , _stores_to_locals() { - set_bci(bci); +#ifndef PRODUCT + set_printable_bci(bci); +#endif } // accessors int block_id() const { return _block_id; } + int bci() const { return _bci; } BlockList* successors() { return &_successors; } BlockBegin* dominator() const { return _dominator; } int loop_depth() const { return _loop_depth; } @@ -1596,7 +1545,6 @@ LEAF(BlockBegin, StateSplit) BitMap& stores_to_locals() { return _stores_to_locals; } // manipulation - void set_bci(int bci) { Instruction::set_bci(bci); } void set_dominator(BlockBegin* dom) { _dominator = dom; } void set_loop_depth(int d) { _loop_depth = d; } void set_depth_first_number(int dfn) { _depth_first_number = dfn; } @@ -1694,7 +1642,6 @@ BASE(BlockEnd, StateSplit) private: BlockBegin* _begin; BlockList* _sux; - ValueStack* _state_before; protected: BlockList* sux() const { return _sux; } @@ -1710,24 +1657,20 @@ BASE(BlockEnd, StateSplit) public: // creation BlockEnd(ValueType* type, ValueStack* state_before, bool is_safepoint) - : StateSplit(type) + : StateSplit(type, state_before) , _begin(NULL) , _sux(NULL) - , _state_before(state_before) { + { set_flag(IsSafepointFlag, is_safepoint); } // accessors - ValueStack* state_before() const { return _state_before; } bool is_safepoint() const { return check_flag(IsSafepointFlag); } BlockBegin* begin() const { return _begin; } // manipulation void set_begin(BlockBegin* begin); - // generic - virtual void other_values_do(ValueVisitor* f); - // successors int number_of_sux() const { return _sux != NULL ? _sux->length() : 0; } BlockBegin* sux_at(int i) const { return _sux->at(i); } @@ -1919,6 +1862,8 @@ BASE(Switch, BlockEnd) Value tag() const { return _tag; } int length() const { return number_of_sux() - 1; } + virtual bool needs_exception_state() const { return false; } + // generic virtual void input_values_do(ValueVisitor* f) { BlockEnd::input_values_do(f); f->visit(&_tag); } }; @@ -1996,7 +1941,6 @@ LEAF(Throw, BlockEnd) // generic virtual bool can_trap() const { return true; } virtual void input_values_do(ValueVisitor* f) { BlockEnd::input_values_do(f); f->visit(&_exception); } - virtual void state_values_do(ValueVisitor* f); }; @@ -2091,7 +2035,6 @@ BASE(UnsafeOp, Instruction) // generic virtual void input_values_do(ValueVisitor* f) { } - virtual void other_values_do(ValueVisitor* f) { } }; diff --git a/hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp b/hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp index 84e7b6fb897..c88a9a60a8c 100644 --- a/hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp +++ b/hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp @@ -316,7 +316,7 @@ void InstructionPrinter::print_head() { void InstructionPrinter::print_line(Instruction* instr) { // print instruction data on one line if (instr->is_pinned()) output()->put('.'); - fill_to(bci_pos ); output()->print("%d", instr->bci()); + fill_to(bci_pos ); output()->print("%d", instr->printable_bci()); fill_to(use_pos ); output()->print("%d", instr->use_count()); fill_to(temp_pos ); print_temp(instr); fill_to(instr_pos); print_instr(instr); @@ -569,7 +569,7 @@ void InstructionPrinter::do_BlockBegin(BlockBegin* x) { if (printed_flag) output()->print(") "); // print block bci range - output()->print("[%d, %d]", x->bci(), (end == NULL ? -1 : end->bci())); + output()->print("[%d, %d]", x->bci(), (end == NULL ? -1 : end->printable_bci())); // print block successors if (end != NULL && end->number_of_sux() > 0) { diff --git a/hotspot/src/share/vm/c1/c1_LIR.cpp b/hotspot/src/share/vm/c1/c1_LIR.cpp index 8a53cd5c39d..62a3a81c94d 100644 --- a/hotspot/src/share/vm/c1/c1_LIR.cpp +++ b/hotspot/src/share/vm/c1/c1_LIR.cpp @@ -1520,7 +1520,7 @@ static void print_block(BlockBegin* x) { if (x->is_set(BlockBegin::linear_scan_loop_end_flag)) tty->print("le "); // print block bci range - tty->print("[%d, %d] ", x->bci(), (end == NULL ? -1 : end->bci())); + tty->print("[%d, %d] ", x->bci(), (end == NULL ? -1 : end->printable_bci())); // print predecessors and successors if (x->number_of_preds() > 0) { @@ -1576,7 +1576,7 @@ void LIR_Op::print_on(outputStream* out) const { } out->print(name()); out->print(" "); print_instr(out); - if (info() != NULL) out->print(" [bci:%d]", info()->bci()); + if (info() != NULL) out->print(" [bci:%d]", info()->stack()->bci()); #ifdef ASSERT if (Verbose && _file != NULL) { out->print(" (%s:%d)", _file, _line); @@ -1781,7 +1781,7 @@ void LIR_OpBranch::print_instr(outputStream* out) const { out->print("["); stub()->print_name(out); out->print(": 0x%x]", stub()); - if (stub()->info() != NULL) out->print(" [bci:%d]", stub()->info()->bci()); + if (stub()->info() != NULL) out->print(" [bci:%d]", stub()->info()->stack()->bci()); } else { out->print("[label:0x%x] ", label()); } @@ -1896,7 +1896,7 @@ void LIR_OpTypeCheck::print_instr(outputStream* out) const { tmp2()->print(out); out->print(" "); tmp3()->print(out); out->print(" "); result_opr()->print(out); out->print(" "); - if (info_for_exception() != NULL) out->print(" [bci:%d]", info_for_exception()->bci()); + if (info_for_exception() != NULL) out->print(" [bci:%d]", info_for_exception()->stack()->bci()); } diff --git a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp index de2a1a9f21d..95127d8abae 100644 --- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp +++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp @@ -35,7 +35,7 @@ void LIR_Assembler::patching_epilog(PatchingStub* patch, LIR_PatchCode patch_cod append_patching_stub(patch); #ifdef ASSERT - Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->bci()); + Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->stack()->bci()); if (patch->id() == PatchingStub::access_field_id) { switch (code) { case Bytecodes::_putstatic: @@ -221,7 +221,7 @@ void LIR_Assembler::emit_block(BlockBegin* block) { #ifndef PRODUCT if (CommentedAssembly) { stringStream st; - st.print_cr(" block B%d [%d, %d]", block->block_id(), block->bci(), block->end()->bci()); + st.print_cr(" block B%d [%d, %d]", block->block_id(), block->bci(), block->end()->printable_bci()); _masm->block_comment(st.as_string()); } #endif @@ -312,7 +312,7 @@ void LIR_Assembler::add_call_info(int pc_offset, CodeEmitInfo* cinfo) { static ValueStack* debug_info(Instruction* ins) { StateSplit* ss = ins->as_StateSplit(); if (ss != NULL) return ss->state(); - return ins->lock_stack(); + return ins->state_before(); } void LIR_Assembler::process_debug_info(LIR_Op* op) { @@ -327,8 +327,7 @@ void LIR_Assembler::process_debug_info(LIR_Op* op) { if (vstack == NULL) return; if (_pending_non_safepoint != NULL) { // Got some old debug info. Get rid of it. - if (_pending_non_safepoint->bci() == src->bci() && - debug_info(_pending_non_safepoint) == vstack) { + if (debug_info(_pending_non_safepoint) == vstack) { _pending_non_safepoint_offset = pc_offset; return; } @@ -358,7 +357,7 @@ static ValueStack* nth_oldest(ValueStack* s, int n, int& bci_result) { ValueStack* tc = t->caller_state(); if (tc == NULL) return s; t = tc; - bci_result = s->scope()->caller_bci(); + bci_result = tc->bci(); s = s->caller_state(); } } @@ -366,7 +365,7 @@ static ValueStack* nth_oldest(ValueStack* s, int n, int& bci_result) { void LIR_Assembler::record_non_safepoint_debug_info() { int pc_offset = _pending_non_safepoint_offset; ValueStack* vstack = debug_info(_pending_non_safepoint); - int bci = _pending_non_safepoint->bci(); + int bci = vstack->bci(); DebugInformationRecorder* debug_info = compilation()->debug_info_recorder(); assert(debug_info->recording_non_safepoints(), "sanity"); @@ -380,7 +379,7 @@ void LIR_Assembler::record_non_safepoint_debug_info() { if (s == NULL) break; IRScope* scope = s->scope(); //Always pass false for reexecute since these ScopeDescs are never used for deopt - debug_info->describe_scope(pc_offset, scope->method(), s_bci, false/*reexecute*/); + debug_info->describe_scope(pc_offset, scope->method(), s->bci(), false/*reexecute*/); } debug_info->end_non_safepoint(pc_offset); diff --git a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp index 41356516d79..ed3596dc67c 100644 --- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp @@ -386,18 +386,26 @@ void LIRGenerator::walk(Value instr) { CodeEmitInfo* LIRGenerator::state_for(Instruction* x, ValueStack* state, bool ignore_xhandler) { - int index; - Value value; - for_each_stack_value(state, index, value) { - assert(value->subst() == value, "missed substition"); - if (!value->is_pinned() && value->as_Constant() == NULL && value->as_Local() == NULL) { - walk(value); - assert(value->operand()->is_valid(), "must be evaluated now"); - } - } + assert(state != NULL, "state must be defined"); + ValueStack* s = state; - int bci = x->bci(); for_each_state(s) { + if (s->kind() == ValueStack::EmptyExceptionState) { + assert(s->stack_size() == 0 && s->locals_size() == 0 && (s->locks_size() == 0 || s->locks_size() == 1), "state must be empty"); + continue; + } + + int index; + Value value; + for_each_stack_value(s, index, value) { + assert(value->subst() == value, "missed substitution"); + if (!value->is_pinned() && value->as_Constant() == NULL && value->as_Local() == NULL) { + walk(value); + assert(value->operand()->is_valid(), "must be evaluated now"); + } + } + + int bci = s->bci(); IRScope* scope = s->scope(); ciMethod* method = scope->method(); @@ -428,15 +436,14 @@ CodeEmitInfo* LIRGenerator::state_for(Instruction* x, ValueStack* state, bool ig } } } - bci = scope->caller_bci(); } - return new CodeEmitInfo(x->bci(), state, ignore_xhandler ? NULL : x->exception_handlers()); + return new CodeEmitInfo(state, ignore_xhandler ? NULL : x->exception_handlers()); } CodeEmitInfo* LIRGenerator::state_for(Instruction* x) { - return state_for(x, x->lock_stack()); + return state_for(x, x->exception_state()); } @@ -900,18 +907,14 @@ void LIRGenerator::move_to_phi(ValueStack* cur_state) { Value sux_value; int index; + assert(cur_state->scope() == sux_state->scope(), "not matching"); + assert(cur_state->locals_size() == sux_state->locals_size(), "not matching"); + assert(cur_state->stack_size() == sux_state->stack_size(), "not matching"); + for_each_stack_value(sux_state, index, sux_value) { move_to_phi(&resolver, cur_state->stack_at(index), sux_value); } - // Inlining may cause the local state not to match up, so walk up - // the caller state until we get to the same scope as the - // successor and then start processing from there. - while (cur_state->scope() != sux_state->scope()) { - cur_state = cur_state->caller_state(); - assert(cur_state != NULL, "scopes don't match up"); - } - for_each_local_value(sux_state, index, sux_value) { move_to_phi(&resolver, cur_state->local_at(index), sux_value); } @@ -1023,10 +1026,10 @@ void LIRGenerator::do_Phi(Phi* x) { // Code for a constant is generated lazily unless the constant is frequently used and can't be inlined. void LIRGenerator::do_Constant(Constant* x) { - if (x->state() != NULL) { + if (x->state_before() != NULL) { // Any constant with a ValueStack requires patching so emit the patch here LIR_Opr reg = rlock_result(x); - CodeEmitInfo* info = state_for(x, x->state()); + CodeEmitInfo* info = state_for(x, x->state_before()); __ oop2reg_patch(NULL, reg, info); } else if (x->use_count() > 1 && !can_inline_as_constant(x)) { if (!x->is_pinned()) { @@ -1102,7 +1105,7 @@ void LIRGenerator::do_getClass(Intrinsic* x) { // need to perform the null check on the rcvr CodeEmitInfo* info = NULL; if (x->needs_null_check()) { - info = state_for(x, x->state()->copy_locks()); + info = state_for(x); } __ move(new LIR_Address(rcvr.result(), oopDesc::klass_offset_in_bytes(), T_OBJECT), result, info); __ move(new LIR_Address(result, Klass::java_mirror_offset_in_bytes() + @@ -1481,7 +1484,7 @@ void LIRGenerator::do_StoreField(StoreField* x) { } else if (x->needs_null_check()) { NullCheck* nc = x->explicit_null_check(); if (nc == NULL) { - info = state_for(x, x->lock_stack()); + info = state_for(x); } else { info = state_for(nc); } @@ -1509,10 +1512,12 @@ void LIRGenerator::do_StoreField(StoreField* x) { set_no_result(x); +#ifndef PRODUCT if (PrintNotLoaded && needs_patching) { tty->print_cr(" ###class not loaded at store_%s bci %d", - x->is_static() ? "static" : "field", x->bci()); + x->is_static() ? "static" : "field", x->printable_bci()); } +#endif if (x->needs_null_check() && (needs_patching || @@ -1575,7 +1580,7 @@ void LIRGenerator::do_LoadField(LoadField* x) { } else if (x->needs_null_check()) { NullCheck* nc = x->explicit_null_check(); if (nc == NULL) { - info = state_for(x, x->lock_stack()); + info = state_for(x); } else { info = state_for(nc); } @@ -1585,10 +1590,12 @@ void LIRGenerator::do_LoadField(LoadField* x) { object.load_item(); +#ifndef PRODUCT if (PrintNotLoaded && needs_patching) { tty->print_cr(" ###class not loaded at load_%s bci %d", - x->is_static() ? "static" : "field", x->bci()); + x->is_static() ? "static" : "field", x->printable_bci()); } +#endif if (x->needs_null_check() && (needs_patching || @@ -1781,7 +1788,7 @@ void LIRGenerator::do_Throw(Throw* x) { if (GenerateCompilerNullChecks && (x->exception()->as_NewInstance() == NULL && x->exception()->as_ExceptionObject() == NULL)) { // if the exception object wasn't created using new then it might be null. - __ null_check(exception_opr, new CodeEmitInfo(info, true)); + __ null_check(exception_opr, new CodeEmitInfo(info, x->state()->copy(ValueStack::ExceptionState, x->state()->bci()))); } if (compilation()->env()->jvmti_can_post_on_exceptions()) { @@ -2127,7 +2134,6 @@ void LIRGenerator::do_TableSwitch(TableSwitch* x) { int lo_key = x->lo_key(); int hi_key = x->hi_key(); int len = x->length(); - CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr value = tag.result(); if (UseTableRanges) { do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); @@ -2186,7 +2192,7 @@ void LIRGenerator::do_Goto(Goto* x) { // increment backedge counter if needed CodeEmitInfo* info = state_for(x, state); - increment_backedge_counter(info, info->bci()); + increment_backedge_counter(info, info->stack()->bci()); CodeEmitInfo* safepoint_info = state_for(x, state); __ safepoint(safepoint_poll_register(), safepoint_info); } @@ -2293,7 +2299,7 @@ void LIRGenerator::do_Base(Base* x) { LIR_Opr lock = new_register(T_INT); __ load_stack_address_monitor(0, lock); - CodeEmitInfo* info = new CodeEmitInfo(SynchronizationEntryBCI, scope()->start()->state(), NULL); + CodeEmitInfo* info = new CodeEmitInfo(scope()->start()->state()->copy(ValueStack::StateBefore, SynchronizationEntryBCI), NULL); CodeStub* slow_path = new MonitorEnterStub(obj, lock, info); // receiver is guaranteed non-NULL so don't need CodeEmitInfo @@ -2303,7 +2309,7 @@ void LIRGenerator::do_Base(Base* x) { // increment invocation counters if needed if (!method()->is_accessor()) { // Accessors do not have MDOs, so no counting. - CodeEmitInfo* info = new CodeEmitInfo(InvocationEntryBci, scope()->start()->state(), NULL); + CodeEmitInfo* info = new CodeEmitInfo(scope()->start()->state(), NULL); increment_invocation_counter(info); } @@ -2463,7 +2469,7 @@ void LIRGenerator::do_Invoke(Invoke* x) { break; case Bytecodes::_invokedynamic: { ciBytecodeStream bcs(x->scope()->method()); - bcs.force_bci(x->bci()); + bcs.force_bci(x->state()->bci()); assert(bcs.cur_bc() == Bytecodes::_invokedynamic, "wrong stream"); ciCPCache* cpcache = bcs.get_cpcache(); diff --git a/hotspot/src/share/vm/c1/c1_LinearScan.cpp b/hotspot/src/share/vm/c1/c1_LinearScan.cpp index 1b99ef83539..166c9fd844b 100644 --- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp +++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp @@ -2274,8 +2274,8 @@ void assert_equal(IRScopeDebugInfo* d1, IRScopeDebugInfo* d2) { } void check_stack_depth(CodeEmitInfo* info, int stack_end) { - if (info->bci() != SynchronizationEntryBCI && !info->scope()->method()->is_native()) { - Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->bci()); + if (info->stack()->bci() != SynchronizationEntryBCI && !info->scope()->method()->is_native()) { + Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->stack()->bci()); switch (code) { case Bytecodes::_ifnull : // fall through case Bytecodes::_ifnonnull : // fall through @@ -2379,7 +2379,7 @@ OopMap* LinearScan::compute_oop_map(IntervalWalker* iw, LIR_Op* op, CodeEmitInfo // add oops from lock stack assert(info->stack() != NULL, "CodeEmitInfo must always have a stack"); - int locks_count = info->stack()->locks_size(); + int locks_count = info->stack()->total_locks_size(); for (int i = 0; i < locks_count; i++) { map->set_oop(frame_map()->monitor_object_regname(i)); } @@ -2762,19 +2762,13 @@ int LinearScan::append_scope_value(int op_id, Value value, GrowableArraycaller_state(); + ValueStack* caller_state = cur_state->caller_state(); if (caller_state != NULL) { // process recursively to compute outermost scope first - stack_begin = caller_state->stack_size(); - locks_begin = caller_state->locks_size(); - caller_debug_info = compute_debug_info_for_scope(op_id, cur_scope->caller(), caller_state, innermost_state, cur_scope->caller_bci(), stack_begin, locks_begin); - } else { - stack_begin = 0; - locks_begin = 0; + caller_debug_info = compute_debug_info_for_scope(op_id, cur_scope->caller(), caller_state, innermost_state); } // initialize these to null. @@ -2785,7 +2779,7 @@ IRScopeDebugInfo* LinearScan::compute_debug_info_for_scope(int op_id, IRScope* c GrowableArray* monitors = NULL; // describe local variable values - int nof_locals = cur_scope->method()->max_locals(); + int nof_locals = cur_state->locals_size(); if (nof_locals > 0) { locals = new GrowableArray(nof_locals); @@ -2800,45 +2794,41 @@ IRScopeDebugInfo* LinearScan::compute_debug_info_for_scope(int op_id, IRScope* c } assert(locals->length() == cur_scope->method()->max_locals(), "wrong number of locals"); assert(locals->length() == cur_state->locals_size(), "wrong number of locals"); + } else if (cur_scope->method()->max_locals() > 0) { + assert(cur_state->kind() == ValueStack::EmptyExceptionState, "should be"); + nof_locals = cur_scope->method()->max_locals(); + locals = new GrowableArray(nof_locals); + for(int i = 0; i < nof_locals; i++) { + locals->append(&_illegal_value); + } } - // describe expression stack - // - // When we inline methods containing exception handlers, the - // "lock_stacks" are changed to preserve expression stack values - // in caller scopes when exception handlers are present. This - // can cause callee stacks to be smaller than caller stacks. - if (stack_end > innermost_state->stack_size()) { - stack_end = innermost_state->stack_size(); - } - - - - int nof_stack = stack_end - stack_begin; + int nof_stack = cur_state->stack_size(); if (nof_stack > 0) { expressions = new GrowableArray(nof_stack); - int pos = stack_begin; - while (pos < stack_end) { - Value expression = innermost_state->stack_at_inc(pos); + int pos = 0; + while (pos < nof_stack) { + Value expression = cur_state->stack_at_inc(pos); append_scope_value(op_id, expression, expressions); - assert(expressions->length() + stack_begin == pos, "must match"); + assert(expressions->length() == pos, "must match"); } + assert(expressions->length() == cur_state->stack_size(), "wrong number of stack entries"); } // describe monitors - assert(locks_begin <= locks_end, "error in scope iteration"); - int nof_locks = locks_end - locks_begin; + int nof_locks = cur_state->locks_size(); if (nof_locks > 0) { + int lock_offset = cur_state->caller_state() != NULL ? cur_state->caller_state()->total_locks_size() : 0; monitors = new GrowableArray(nof_locks); - for (int i = locks_begin; i < locks_end; i++) { - monitors->append(location_for_monitor_index(i)); + for (int i = 0; i < nof_locks; i++) { + monitors->append(location_for_monitor_index(lock_offset + i)); } } - return new IRScopeDebugInfo(cur_scope, cur_bci, locals, expressions, monitors, caller_debug_info); + return new IRScopeDebugInfo(cur_scope, cur_state->bci(), locals, expressions, monitors, caller_debug_info); } @@ -2850,17 +2840,14 @@ void LinearScan::compute_debug_info(CodeEmitInfo* info, int op_id) { assert(innermost_scope != NULL && innermost_state != NULL, "why is it missing?"); - int stack_end = innermost_state->stack_size(); - int locks_end = innermost_state->locks_size(); - - DEBUG_ONLY(check_stack_depth(info, stack_end)); + DEBUG_ONLY(check_stack_depth(info, innermost_state->stack_size())); if (info->_scope_debug_info == NULL) { // compute debug information - info->_scope_debug_info = compute_debug_info_for_scope(op_id, innermost_scope, innermost_state, innermost_state, info->bci(), stack_end, locks_end); + info->_scope_debug_info = compute_debug_info_for_scope(op_id, innermost_scope, innermost_state, innermost_state); } else { // debug information already set. Check that it is correct from the current point of view - DEBUG_ONLY(assert_equal(info->_scope_debug_info, compute_debug_info_for_scope(op_id, innermost_scope, innermost_state, innermost_state, info->bci(), stack_end, locks_end))); + DEBUG_ONLY(assert_equal(info->_scope_debug_info, compute_debug_info_for_scope(op_id, innermost_scope, innermost_state, innermost_state))); } } diff --git a/hotspot/src/share/vm/c1/c1_LinearScan.hpp b/hotspot/src/share/vm/c1/c1_LinearScan.hpp index 9d5b2171e52..a161c679991 100644 --- a/hotspot/src/share/vm/c1/c1_LinearScan.hpp +++ b/hotspot/src/share/vm/c1/c1_LinearScan.hpp @@ -346,7 +346,7 @@ class LinearScan : public CompilationResourceObj { int append_scope_value_for_operand(LIR_Opr opr, GrowableArray* scope_values); int append_scope_value(int op_id, Value value, GrowableArray* scope_values); - IRScopeDebugInfo* compute_debug_info_for_scope(int op_id, IRScope* cur_scope, ValueStack* cur_state, ValueStack* innermost_state, int cur_bci, int stack_end, int locks_end); + IRScopeDebugInfo* compute_debug_info_for_scope(int op_id, IRScope* cur_scope, ValueStack* cur_state, ValueStack* innermost_state); void compute_debug_info(CodeEmitInfo* info, int op_id); void assign_reg_num(LIR_OpList* instructions, IntervalWalker* iw); diff --git a/hotspot/src/share/vm/c1/c1_Optimizer.cpp b/hotspot/src/share/vm/c1/c1_Optimizer.cpp index d3d51cedb09..bb5cd837ecd 100644 --- a/hotspot/src/share/vm/c1/c1_Optimizer.cpp +++ b/hotspot/src/share/vm/c1/c1_Optimizer.cpp @@ -140,25 +140,27 @@ class CE_Eliminator: public BlockClosure { // with an IfOp followed by a Goto // cut if_ away and get node before Instruction* cur_end = if_->prev(block); - int bci = if_->bci(); // append constants of true- and false-block if necessary // clone constants because original block must not be destroyed assert((t_value != f_const && f_value != t_const) || t_const == f_const, "mismatch"); if (t_value == t_const) { t_value = new Constant(t_const->type()); - cur_end = cur_end->set_next(t_value, bci); + NOT_PRODUCT(t_value->set_printable_bci(if_->printable_bci())); + cur_end = cur_end->set_next(t_value); } if (f_value == f_const) { f_value = new Constant(f_const->type()); - cur_end = cur_end->set_next(f_value, bci); + NOT_PRODUCT(f_value->set_printable_bci(if_->printable_bci())); + cur_end = cur_end->set_next(f_value); } // it is very unlikely that the condition can be statically decided // (this was checked previously by the Canonicalizer), so always // append IfOp Value result = new IfOp(if_->x(), if_->cond(), if_->y(), t_value, f_value); - cur_end = cur_end->set_next(result, bci); + NOT_PRODUCT(result->set_printable_bci(if_->printable_bci())); + cur_end = cur_end->set_next(result); // append Goto to successor ValueStack* state_before = if_->is_safepoint() ? if_->state_before() : NULL; @@ -167,16 +169,15 @@ class CE_Eliminator: public BlockClosure { // prepare state for Goto ValueStack* goto_state = if_->state(); while (sux_state->scope() != goto_state->scope()) { - goto_state = goto_state->pop_scope(); + goto_state = goto_state->caller_state(); assert(goto_state != NULL, "states do not match up"); } - goto_state = goto_state->copy(); + goto_state = goto_state->copy(ValueStack::StateAfter, goto_state->bci()); goto_state->push(result->type(), result); - assert(goto_state->is_same_across_scopes(sux_state), "states must match now"); + assert(goto_state->is_same(sux_state), "states must match now"); goto_->set_state(goto_state); - // Steal the bci for the goto from the sux - cur_end = cur_end->set_next(goto_, sux->bci()); + cur_end = cur_end->set_next(goto_, goto_state->bci()); // Adjust control flow graph BlockBegin::disconnect_edge(block, t_block); @@ -251,10 +252,8 @@ class BlockMerger: public BlockClosure { // no phi functions must be present at beginning of sux ValueStack* sux_state = sux->state(); ValueStack* end_state = end->state(); - while (end_state->scope() != sux_state->scope()) { - // match up inlining level - end_state = end_state->pop_scope(); - } + + assert(end_state->scope() == sux_state->scope(), "scopes must match"); assert(end_state->stack_size() == sux_state->stack_size(), "stack not equal"); assert(end_state->locals_size() == sux_state->locals_size(), "locals not equal"); @@ -273,7 +272,7 @@ class BlockMerger: public BlockClosure { Instruction* prev = end->prev(block); Instruction* next = sux->next(); assert(prev->as_BlockEnd() == NULL, "must not be a BlockEnd"); - prev->set_next(next, next->bci()); + prev->set_next(next); sux->disconnect_from_graph(); block->set_end(sux->end()); // add exception handlers of deleted block, if any @@ -337,7 +336,8 @@ class BlockMerger: public BlockClosure { newif->set_state(if_->state()->copy()); assert(prev->next() == if_, "must be guaranteed by above search"); - prev->set_next(newif, if_->bci()); + NOT_PRODUCT(newif->set_printable_bci(if_->printable_bci())); + prev->set_next(newif); block->set_end(newif); _merge_count++; @@ -705,7 +705,7 @@ void NullCheckEliminator::iterate_one(BlockBegin* block) { // visiting instructions which are references in other blocks or // visiting instructions more than once. mark_visitable(instr); - if (instr->is_root() || instr->can_trap() || (instr->as_NullCheck() != NULL)) { + if (instr->is_pinned() || instr->can_trap() || (instr->as_NullCheck() != NULL)) { mark_visited(instr); instr->input_values_do(this); instr->visit(&_visitor); diff --git a/hotspot/src/share/vm/c1/c1_ValueStack.cpp b/hotspot/src/share/vm/c1/c1_ValueStack.cpp index 261176507b3..40dfadbff61 100644 --- a/hotspot/src/share/vm/c1/c1_ValueStack.cpp +++ b/hotspot/src/share/vm/c1/c1_ValueStack.cpp @@ -28,55 +28,60 @@ // Implementation of ValueStack -ValueStack::ValueStack(IRScope* scope, int locals_size, int max_stack_size) +ValueStack::ValueStack(IRScope* scope, ValueStack* caller_state) : _scope(scope) -, _locals(locals_size, NULL) -, _stack(max_stack_size) -, _lock_stack(false) -, _locks(1) +, _caller_state(caller_state) +, _bci(-99) +, _kind(Parsing) +, _locals(scope->method()->max_locals(), NULL) +, _stack(scope->method()->max_stack()) +, _locks() { - assert(scope != NULL, "scope must exist"); -} - -ValueStack* ValueStack::copy() { - ValueStack* s = new ValueStack(scope(), locals_size(), max_stack_size()); - s->_stack.appendAll(&_stack); - s->_locks.appendAll(&_locks); - s->replace_locals(this); - return s; + verify(); } -ValueStack* ValueStack::copy_locks() { - int sz = scope()->lock_stack_size(); - if (stack_size() == 0) { - sz = 0; +ValueStack::ValueStack(ValueStack* copy_from, Kind kind, int bci) + : _scope(copy_from->scope()) + , _caller_state(copy_from->caller_state()) + , _bci(bci) + , _kind(kind) + , _locals() + , _stack() + , _locks(copy_from->locks_size()) +{ + assert(kind != EmptyExceptionState || !Compilation::current()->env()->jvmti_can_access_local_variables(), "need locals"); + if (kind != EmptyExceptionState) { + // only allocate space if we need to copy the locals-array + _locals = Values(copy_from->locals_size()); + _locals.appendAll(©_from->_locals); } - ValueStack* s = new ValueStack(scope(), locals_size(), sz); - s->_lock_stack = true; - s->_locks.appendAll(&_locks); - s->replace_locals(this); - if (sz > 0) { - assert(sz <= stack_size(), "lock stack underflow"); - for (int i = 0; i < sz; i++) { - s->_stack.append(_stack[i]); + + if (kind != ExceptionState && kind != EmptyExceptionState) { + if (kind == Parsing) { + // stack will be modified, so reserve enough space to avoid resizing + _stack = Values(scope()->method()->max_stack()); + } else { + // stack will not be modified, so do not waste space + _stack = Values(copy_from->stack_size()); } + _stack.appendAll(©_from->_stack); } - return s; + + _locks.appendAll(©_from->_locks); + + verify(); } + bool ValueStack::is_same(ValueStack* s) { - assert(s != NULL, "state must exist"); - assert(scope () == s->scope (), "scopes must correspond"); - assert(locals_size() == s->locals_size(), "locals sizes must correspond"); - return is_same_across_scopes(s); -} + if (scope() != s->scope()) return false; + if (caller_state() != s->caller_state()) return false; + if (locals_size() != s->locals_size()) return false; + if (stack_size() != s->stack_size()) return false; + if (locks_size() != s->locks_size()) return false; -bool ValueStack::is_same_across_scopes(ValueStack* s) { - assert(s != NULL, "state must exist"); - assert(stack_size () == s->stack_size (), "stack sizes must correspond"); - assert(locks_size () == s->locks_size (), "locks sizes must correspond"); // compare each stack element with the corresponding stack element of s int index; Value value; @@ -89,12 +94,6 @@ bool ValueStack::is_same_across_scopes(ValueStack* s) { return true; } - -ValueStack* ValueStack::caller_state() const { - return scope()->caller_state(); -} - - void ValueStack::clear_locals() { for (int i = _locals.length() - 1; i >= 0; i--) { _locals.at_put(i, NULL); @@ -102,13 +101,6 @@ void ValueStack::clear_locals() { } -void ValueStack::replace_locals(ValueStack* with) { - assert(locals_size() == with->locals_size(), "number of locals must match"); - for (int i = locals_size() - 1; i >= 0; i--) { - _locals.at_put(i, with->_locals.at(i)); - } -} - void ValueStack::pin_stack_for_linear_scan() { for_each_state_value(this, v, if (v->as_Constant() == NULL && v->as_Local() == NULL) { @@ -123,33 +115,25 @@ void ValueStack::apply(Values list, ValueVisitor* f) { for (int i = 0; i < list.length(); i++) { Value* va = list.adr_at(i); Value v0 = *va; - if (v0 != NULL) { - if (!v0->type()->is_illegal()) { - assert(v0->as_HiWord() == NULL, "should never see HiWord during traversal"); - f->visit(va); + if (v0 != NULL && !v0->type()->is_illegal()) { + f->visit(va); #ifdef ASSERT - Value v1 = *va; - if (v0 != v1) { - assert(v1->type()->is_illegal() || v0->type()->tag() == v1->type()->tag(), "types must match"); - if (v0->type()->is_double_word()) { - list.at_put(i + 1, v0->hi_word()); - } - } + Value v1 = *va; + assert(v1->type()->is_illegal() || v0->type()->tag() == v1->type()->tag(), "types must match"); + assert(!v1->type()->is_double_word() || list.at(i + 1) == NULL, "hi-word of doubleword value must be NULL"); #endif - if (v0->type()->is_double_word()) i++; - } + if (v0->type()->is_double_word()) i++; } } } void ValueStack::values_do(ValueVisitor* f) { - apply(_stack, f); - apply(_locks, f); - ValueStack* state = this; for_each_state(state) { apply(state->_locals, f); + apply(state->_stack, f); + apply(state->_locks, f); } } @@ -164,52 +148,26 @@ Values* ValueStack::pop_arguments(int argument_size) { } -int ValueStack::lock(IRScope* scope, Value obj) { +int ValueStack::total_locks_size() const { + int num_locks = 0; + const ValueStack* state = this; + for_each_state(state) { + num_locks += state->locks_size(); + } + return num_locks; +} + +int ValueStack::lock(Value obj) { _locks.push(obj); - scope->set_min_number_of_locks(locks_size()); - return locks_size() - 1; + int num_locks = total_locks_size(); + scope()->set_min_number_of_locks(num_locks); + return num_locks - 1; } int ValueStack::unlock() { _locks.pop(); - return locks_size(); -} - - -ValueStack* ValueStack::push_scope(IRScope* scope) { - assert(scope->caller() == _scope, "scopes must have caller/callee relationship"); - ValueStack* res = new ValueStack(scope, - scope->method()->max_locals(), - max_stack_size() + scope->method()->max_stack()); - // Preserves stack and monitors. - res->_stack.appendAll(&_stack); - res->_locks.appendAll(&_locks); - assert(res->_stack.size() <= res->max_stack_size(), "stack overflow"); - return res; -} - - -ValueStack* ValueStack::pop_scope() { - assert(_scope->caller() != NULL, "scope must have caller"); - IRScope* scope = _scope->caller(); - int max_stack = max_stack_size() - _scope->method()->max_stack(); - assert(max_stack >= 0, "stack underflow"); - ValueStack* res = new ValueStack(scope, - scope->method()->max_locals(), - max_stack); - // Preserves stack and monitors. Restores local and store state from caller scope. - res->_stack.appendAll(&_stack); - res->_locks.appendAll(&_locks); - ValueStack* caller = caller_state(); - if (caller != NULL) { - for (int i = 0; i < caller->_locals.length(); i++) { - res->_locals.at_put(i, caller->_locals.at(i)); - } - assert(res->_locals.length() == res->scope()->method()->max_locals(), "just checking"); - } - assert(res->_stack.size() <= res->max_stack_size(), "stack overflow"); - return res; + return total_locks_size(); } @@ -220,11 +178,7 @@ void ValueStack::setup_phi_for_stack(BlockBegin* b, int index) { Value phi = new Phi(t, b, -index - 1); _stack[index] = phi; -#ifdef ASSERT - if (t->is_double_word()) { - _stack[index + 1] = phi->hi_word(); - } -#endif + assert(!t->is_double_word() || _stack.at(index + 1) == NULL, "hi-word of doubleword value must be NULL"); } void ValueStack::setup_phi_for_local(BlockBegin* b, int index) { @@ -236,7 +190,9 @@ void ValueStack::setup_phi_for_local(BlockBegin* b, int index) { } #ifndef PRODUCT + void ValueStack::print() { + scope()->method()->print_name(); if (stack_is_empty()) { tty->print_cr("empty stack"); } else { @@ -244,18 +200,20 @@ void ValueStack::print() { for (int i = 0; i < stack_size();) { Value t = stack_at_inc(i); tty->print("%2d ", i); + tty->print("%c%d ", t->type()->tchar(), t->id()); ip.print_instr(t); tty->cr(); } } if (!no_active_locks()) { InstructionPrinter ip; - for (int i = 0; i < locks_size(); i--) { + for (int i = 0; i < locks_size(); i++) { Value t = lock_at(i); tty->print("lock %2d ", i); if (t == NULL) { tty->print("this"); } else { + tty->print("%c%d ", t->type()->tchar(), t->id()); ip.print_instr(t); } tty->cr(); @@ -270,16 +228,55 @@ void ValueStack::print() { tty->print("null"); i ++; } else { + tty->print("%c%d ", l->type()->tchar(), l->id()); ip.print_instr(l); if (l->type()->is_illegal() || l->type()->is_single_word()) i ++; else i += 2; } tty->cr(); } } + + if (caller_state() != NULL) { + caller_state()->print(); + } } void ValueStack::verify() { - Unimplemented(); + assert(scope() != NULL, "scope must exist"); + if (caller_state() != NULL) { + assert(caller_state()->scope() == scope()->caller(), "invalid caller scope"); + caller_state()->verify(); + } + + if (kind() == Parsing) { + assert(bci() == -99, "bci not defined during parsing"); + } else { + assert(bci() >= -1, "bci out of range"); + assert(bci() < scope()->method()->code_size(), "bci out of range"); + assert(bci() == SynchronizationEntryBCI || Bytecodes::is_defined(scope()->method()->java_code_at_bci(bci())), "make sure bci points at a real bytecode"); + assert(scope()->method()->liveness_at_bci(bci()).is_valid(), "liveness at bci must be valid"); + } + + int i; + for (i = 0; i < stack_size(); i++) { + Value v = _stack.at(i); + if (v == NULL) { + assert(_stack.at(i - 1)->type()->is_double_word(), "only hi-words are NULL on stack"); + } else if (v->type()->is_double_word()) { + assert(_stack.at(i + 1) == NULL, "hi-word must be NULL"); + } + } + + for (i = 0; i < locals_size(); i++) { + Value v = _locals.at(i); + if (v != NULL && v->type()->is_double_word()) { + assert(_locals.at(i + 1) == NULL, "hi-word must be NULL"); + } + } + + for_each_state_value(this, v, + assert(v != NULL, "just test if state-iteration succeeds"); + ); } #endif // PRODUCT diff --git a/hotspot/src/share/vm/c1/c1_ValueStack.hpp b/hotspot/src/share/vm/c1/c1_ValueStack.hpp index 9e254bf0dcd..c65422567e1 100644 --- a/hotspot/src/share/vm/c1/c1_ValueStack.hpp +++ b/hotspot/src/share/vm/c1/c1_ValueStack.hpp @@ -23,9 +23,23 @@ */ class ValueStack: public CompilationResourceObj { + public: + enum Kind { + Parsing, // During abstract interpretation in GraphBuilder + CallerState, // Caller state when inlining + StateBefore, // Before before execution of instruction + StateAfter, // After execution of instruction + ExceptionState, // Exception handling of instruction + EmptyExceptionState, // Exception handling of instructions not covered by an xhandler + BlockBeginState // State of BlockBegin instruction with phi functions of this block + }; + private: IRScope* _scope; // the enclosing scope - bool _lock_stack; // indicates that this ValueStack is for an exception site + ValueStack* _caller_state; + int _bci; + Kind _kind; + Values _locals; // the locals Values _stack; // the expression stack Values _locks; // the monitor stack (holding the locked values) @@ -36,100 +50,79 @@ class ValueStack: public CompilationResourceObj { } Value check(ValueTag tag, Value t, Value h) { - assert(h->as_HiWord()->lo_word() == t, "incorrect stack pair"); + assert(h == NULL, "hi-word of doubleword value must be NULL"); return check(tag, t); } // helper routine static void apply(Values list, ValueVisitor* f); + // for simplified copying + ValueStack(ValueStack* copy_from, Kind kind, int bci); + public: // creation - ValueStack(IRScope* scope, int locals_size, int max_stack_size); + ValueStack(IRScope* scope, ValueStack* caller_state); + + ValueStack* copy() { return new ValueStack(this, _kind, _bci); } + ValueStack* copy(Kind new_kind, int new_bci) { return new ValueStack(this, new_kind, new_bci); } + ValueStack* copy_for_parsing() { return new ValueStack(this, Parsing, -99); } + + void set_caller_state(ValueStack* s) { assert(kind() == EmptyExceptionState, "only EmptyExceptionStates can be modified"); _caller_state = s; } - // merging - ValueStack* copy(); // returns a copy of this w/ cleared locals - ValueStack* copy_locks(); // returns a copy of this w/ cleared locals and stack - // Note that when inlining of methods with exception - // handlers is enabled, this stack may have a - // non-empty expression stack (size defined by - // scope()->lock_stack_size()) bool is_same(ValueStack* s); // returns true if this & s's types match (w/o checking locals) - bool is_same_across_scopes(ValueStack* s); // same as is_same but returns true even if stacks are in different scopes (used for block merging w/inlining) // accessors IRScope* scope() const { return _scope; } - bool is_lock_stack() const { return _lock_stack; } + ValueStack* caller_state() const { return _caller_state; } + int bci() const { return _bci; } + Kind kind() const { return _kind; } + int locals_size() const { return _locals.length(); } int stack_size() const { return _stack.length(); } int locks_size() const { return _locks.length(); } - int max_stack_size() const { return _stack.capacity(); } bool stack_is_empty() const { return _stack.is_empty(); } bool no_active_locks() const { return _locks.is_empty(); } - ValueStack* caller_state() const; + int total_locks_size() const; // locals access void clear_locals(); // sets all locals to NULL; - // Kill local i. Also kill local i+1 if i was a long or double. void invalidate_local(int i) { - Value x = _locals.at(i); - if (x != NULL && x->type()->is_double_word()) { - assert(_locals.at(i + 1)->as_HiWord()->lo_word() == x, "locals inconsistent"); - _locals.at_put(i + 1, NULL); - } + assert(_locals.at(i)->type()->is_single_word() || + _locals.at(i + 1) == NULL, "hi-word of doubleword value must be NULL"); _locals.at_put(i, NULL); } - - Value load_local(int i) const { + Value local_at(int i) const { Value x = _locals.at(i); - if (x != NULL && x->type()->is_illegal()) return NULL; - assert(x == NULL || x->as_HiWord() == NULL, "index points to hi word"); - assert(x == NULL || x->type()->is_illegal() || x->type()->is_single_word() || x == _locals.at(i+1)->as_HiWord()->lo_word(), "locals inconsistent"); + assert(x == NULL || x->type()->is_single_word() || + _locals.at(i + 1) == NULL, "hi-word of doubleword value must be NULL"); return x; } - Value local_at(int i) const { return _locals.at(i); } - - // Store x into local i. void store_local(int i, Value x) { - // Kill the old value - invalidate_local(i); - _locals.at_put(i, x); - - // Writing a double word can kill other locals - if (x != NULL && x->type()->is_double_word()) { - // If x + i was the start of a double word local then kill i + 2. - Value x2 = _locals.at(i + 1); - if (x2 != NULL && x2->type()->is_double_word()) { - _locals.at_put(i + 2, NULL); - } - - // If x is a double word local, also update i + 1. -#ifdef ASSERT - _locals.at_put(i + 1, x->hi_word()); -#else - _locals.at_put(i + 1, NULL); -#endif - } - // If x - 1 was the start of a double word local then kill i - 1. + // When overwriting local i, check if i - 1 was the start of a + // double word local and kill it. if (i > 0) { Value prev = _locals.at(i - 1); if (prev != NULL && prev->type()->is_double_word()) { _locals.at_put(i - 1, NULL); } } - } - void replace_locals(ValueStack* with); + _locals.at_put(i, x); + if (x->type()->is_double_word()) { + // hi-word of doubleword value is always NULL + _locals.at_put(i + 1, NULL); + } + } // stack access Value stack_at(int i) const { Value x = _stack.at(i); - assert(x->as_HiWord() == NULL, "index points to hi word"); assert(x->type()->is_single_word() || - x->subst() == _stack.at(i+1)->as_HiWord()->lo_word(), "stack inconsistent"); + _stack.at(i + 1) == NULL, "hi-word of doubleword value must be NULL"); return x; } @@ -146,7 +139,6 @@ class ValueStack: public CompilationResourceObj { void values_do(ValueVisitor* f); // untyped manipulation (for dup_x1, etc.) - void clear_stack() { _stack.clear(); } void truncate_stack(int size) { _stack.trunc_to(size); } void raw_push(Value t) { _stack.push(t); } Value raw_pop() { return _stack.pop(); } @@ -156,15 +148,8 @@ class ValueStack: public CompilationResourceObj { void fpush(Value t) { _stack.push(check(floatTag , t)); } void apush(Value t) { _stack.push(check(objectTag , t)); } void rpush(Value t) { _stack.push(check(addressTag, t)); } -#ifdef ASSERT - // in debug mode, use HiWord for 2-word values - void lpush(Value t) { _stack.push(check(longTag , t)); _stack.push(new HiWord(t)); } - void dpush(Value t) { _stack.push(check(doubleTag , t)); _stack.push(new HiWord(t)); } -#else - // in optimized mode, use NULL for 2-word values void lpush(Value t) { _stack.push(check(longTag , t)); _stack.push(NULL); } void dpush(Value t) { _stack.push(check(doubleTag , t)); _stack.push(NULL); } -#endif // ASSERT void push(ValueType* type, Value t) { switch (type->tag()) { @@ -182,15 +167,8 @@ class ValueStack: public CompilationResourceObj { Value fpop() { return check(floatTag , _stack.pop()); } Value apop() { return check(objectTag , _stack.pop()); } Value rpop() { return check(addressTag, _stack.pop()); } -#ifdef ASSERT - // in debug mode, check for HiWord consistency Value lpop() { Value h = _stack.pop(); return check(longTag , _stack.pop(), h); } Value dpop() { Value h = _stack.pop(); return check(doubleTag, _stack.pop(), h); } -#else - // in optimized mode, ignore HiWord since it is NULL - Value lpop() { _stack.pop(); return check(longTag , _stack.pop()); } - Value dpop() { _stack.pop(); return check(doubleTag, _stack.pop()); } -#endif // ASSERT Value pop(ValueType* type) { switch (type->tag()) { @@ -208,16 +186,10 @@ class ValueStack: public CompilationResourceObj { Values* pop_arguments(int argument_size); // locks access - int lock (IRScope* scope, Value obj); + int lock (Value obj); int unlock(); Value lock_at(int i) const { return _locks.at(i); } - // Inlining support - ValueStack* push_scope(IRScope* scope); // "Push" new scope, returning new resulting stack - // Preserves stack and locks, destroys locals - ValueStack* pop_scope(); // "Pop" topmost scope, returning new resulting stack - // Preserves stack and locks, destroys locals - // SSA form IR support void setup_phi_for_stack(BlockBegin* b, int index); void setup_phi_for_local(BlockBegin* b, int index); @@ -298,16 +270,18 @@ class ValueStack: public CompilationResourceObj { { \ int cur_index; \ ValueStack* cur_state = v_state; \ - Value v_value; \ - { \ - for_each_stack_value(cur_state, cur_index, v_value) { \ - v_code; \ - } \ - } \ + Value v_value; \ for_each_state(cur_state) { \ - for_each_local_value(cur_state, cur_index, v_value) { \ - v_code; \ + { \ + for_each_local_value(cur_state, cur_index, v_value) { \ + v_code; \ + } \ } \ + { \ + for_each_stack_value(cur_state, cur_index, v_value) { \ + v_code; \ + } \ + } \ } \ } diff --git a/hotspot/src/share/vm/c1/c1_globals.hpp b/hotspot/src/share/vm/c1/c1_globals.hpp index 25633a63832..e6a3f6ad7ca 100644 --- a/hotspot/src/share/vm/c1/c1_globals.hpp +++ b/hotspot/src/share/vm/c1/c1_globals.hpp @@ -216,9 +216,6 @@ develop(bool, DeoptC1, true, \ "Use deoptimization in C1") \ \ - develop(bool, DeoptOnAsyncException, true, \ - "Deoptimize upon Thread.stop(); improves precision of IR") \ - \ develop(bool, PrintBailouts, false, \ "Print bailout and its reason") \ \ diff --git a/hotspot/src/share/vm/includeDB_compiler1 b/hotspot/src/share/vm/includeDB_compiler1 index 18ff024df70..f578561609e 100644 --- a/hotspot/src/share/vm/includeDB_compiler1 +++ b/hotspot/src/share/vm/includeDB_compiler1 @@ -448,3 +448,7 @@ thread.cpp c1_Compiler.hpp top.hpp c1_globals.hpp vmStructs.hpp c1_Runtime1.hpp + +c1_Canonicalizer.cpp c1_ValueStack.hpp + +c1_LIR.cpp c1_ValueStack.hpp From 28253f9cb3fc1686fcb45c59db91621f63a268de Mon Sep 17 00:00:00 2001 From: Artem Ananiev Date: Tue, 24 Aug 2010 12:54:46 +0400 Subject: [PATCH 002/128] 6949936: Provide API for running nested events loops, similar to what modal dialogs do Reviewed-by: ant, anthony --- jdk/src/share/classes/java/awt/Dialog.java | 111 +------ .../classes/java/awt/EventDispatchThread.java | 6 +- .../share/classes/java/awt/EventQueue.java | 35 ++ .../share/classes/java/awt/SecondaryLoop.java | 147 +++++++++ .../classes/java/awt/WaitDispatchSupport.java | 302 ++++++++++++++++++ .../SecondaryLoopTest/SecondaryLoopTest.java | 126 ++++++++ 6 files changed, 629 insertions(+), 98 deletions(-) create mode 100644 jdk/src/share/classes/java/awt/SecondaryLoop.java create mode 100644 jdk/src/share/classes/java/awt/WaitDispatchSupport.java create mode 100644 jdk/test/java/awt/EventQueue/SecondaryLoopTest/SecondaryLoopTest.java diff --git a/jdk/src/share/classes/java/awt/Dialog.java b/jdk/src/share/classes/java/awt/Dialog.java index 71b08d7226d..3e2effd1dc0 100644 --- a/jdk/src/share/classes/java/awt/Dialog.java +++ b/jdk/src/share/classes/java/awt/Dialog.java @@ -277,10 +277,8 @@ public class Dialog extends Window { */ String title; - private transient volatile boolean keepBlockingEDT = false; - private transient volatile boolean keepBlockingCT = false; - private transient ModalEventFilter modalFilter; + private transient volatile SecondaryLoop secondaryLoop; /* * Indicates that this dialog is being hidden. This flag is set to true at @@ -1005,12 +1003,6 @@ public class Dialog extends Window { super.setVisible(b); } - /** - * Stores the app context on which event dispatch thread the dialog - * is being shown. Initialized in show(), used in hideAndDisposeHandler() - */ - transient private AppContext showAppContext; - /** * Makes the {@code Dialog} visible. If the dialog and/or its owner * are not yet displayable, both are made displayable. The @@ -1037,39 +1029,18 @@ public class Dialog extends Window { if (!isModal()) { conditionalShow(null, null); } else { - // Set this variable before calling conditionalShow(). That - // way, if the Dialog is hidden right after being shown, we - // won't mistakenly block this thread. - keepBlockingEDT = true; - keepBlockingCT = true; - - // Store the app context on which this dialog is being shown. - // Event dispatch thread of this app context will be sleeping until - // we wake it by any event from hideAndDisposeHandler(). - showAppContext = AppContext.getAppContext(); + AppContext showAppContext = AppContext.getAppContext(); AtomicLong time = new AtomicLong(); Component predictedFocusOwner = null; try { predictedFocusOwner = getMostRecentFocusOwner(); if (conditionalShow(predictedFocusOwner, time)) { - // We have two mechanisms for blocking: 1. If we're on the - // EventDispatchThread, start a new event pump. 2. If we're - // on any other thread, call wait() on the treelock. - modalFilter = ModalEventFilter.createFilterForDialog(this); - - final Runnable pumpEventsForFilter = new Runnable() { - public void run() { - EventDispatchThread dispatchThread = - (EventDispatchThread)Thread.currentThread(); - dispatchThread.pumpEventsForFilter(new Conditional() { - public boolean evaluate() { - synchronized (getTreeLock()) { - return keepBlockingEDT && windowClosingException == null; - } - } - }, modalFilter); + Conditional cond = new Conditional() { + @Override + public boolean evaluate() { + return windowClosingException == null; } }; @@ -1096,44 +1067,10 @@ public class Dialog extends Window { modalityPushed(); try { - if (EventQueue.isDispatchThread()) { - /* - * dispose SequencedEvent we are dispatching on current - * AppContext, to prevent us from hang. - * - */ - // BugId 4531693 (son@sparc.spb.su) - SequencedEvent currentSequencedEvent = KeyboardFocusManager. - getCurrentKeyboardFocusManager().getCurrentSequencedEvent(); - if (currentSequencedEvent != null) { - currentSequencedEvent.dispose(); - } - - /* - * Event processing is done inside doPrivileged block so that - * it wouldn't matter even if user code is on the stack - * Fix for BugId 6300270 - */ - - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - pumpEventsForFilter.run(); - return null; - } - }); - } else { - synchronized (getTreeLock()) { - Toolkit.getEventQueue().postEvent(new PeerEvent(this, - pumpEventsForFilter, - PeerEvent.PRIORITY_EVENT)); - while (keepBlockingCT && windowClosingException == null) { - try { - getTreeLock().wait(); - } catch (InterruptedException e) { - break; - } - } - } + EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); + secondaryLoop = eventQueue.createSecondaryLoop(cond, modalFilter, 5000); + if (!secondaryLoop.enter()) { + secondaryLoop = null; } } finally { modalityPopped(); @@ -1194,18 +1131,11 @@ public class Dialog extends Window { windowClosingException = null; } } - final class WakingRunnable implements Runnable { - public void run() { - synchronized (getTreeLock()) { - keepBlockingCT = false; - getTreeLock().notifyAll(); - } - } - } + private void hideAndDisposePreHandler() { isInHide = true; synchronized (getTreeLock()) { - if (keepBlockingEDT) { + if (secondaryLoop != null) { modalHide(); // dialog can be shown and then disposed before its // modal filter is created @@ -1217,20 +1147,9 @@ public class Dialog extends Window { } } private void hideAndDisposeHandler() { - synchronized (getTreeLock()) { - if (keepBlockingEDT) { - keepBlockingEDT = false; - PeerEvent wakingEvent = new PeerEvent(getToolkit(), new WakingRunnable(), PeerEvent.PRIORITY_EVENT); - AppContext curAppContext = AppContext.getAppContext(); - if (showAppContext != curAppContext) { - // Wake up event dispatch thread on which the dialog was - // initially shown - SunToolkit.postEvent(showAppContext, wakingEvent); - showAppContext = null; - } else { - Toolkit.getEventQueue().postEvent(wakingEvent); - } - } + if (secondaryLoop != null) { + secondaryLoop.exit(); + secondaryLoop = null; } isInHide = false; } diff --git a/jdk/src/share/classes/java/awt/EventDispatchThread.java b/jdk/src/share/classes/java/awt/EventDispatchThread.java index eed2c16e514..b47c3686e81 100644 --- a/jdk/src/share/classes/java/awt/EventDispatchThread.java +++ b/jdk/src/share/classes/java/awt/EventDispatchThread.java @@ -113,8 +113,7 @@ class EventDispatchThread extends Thread { pumpEventsForHierarchy(id, cond, null); } - void pumpEventsForHierarchy(int id, Conditional cond, Component modalComponent) - { + void pumpEventsForHierarchy(int id, Conditional cond, Component modalComponent) { pumpEventsForFilter(id, cond, new HierarchyEventFilter(modalComponent)); } @@ -124,6 +123,7 @@ class EventDispatchThread extends Thread { void pumpEventsForFilter(int id, Conditional cond, EventFilter filter) { addEventFilter(filter); + doDispatch = true; while (doDispatch && cond.evaluate()) { if (isInterrupted() || !pumpOneEventForFilters(id)) { doDispatch = false; @@ -133,6 +133,7 @@ class EventDispatchThread extends Thread { } void addEventFilter(EventFilter filter) { + eventLog.finest("adding the event filter: " + filter); synchronized (eventFilters) { if (!eventFilters.contains(filter)) { if (filter instanceof ModalEventFilter) { @@ -156,6 +157,7 @@ class EventDispatchThread extends Thread { } void removeEventFilter(EventFilter filter) { + eventLog.finest("removing the event filter: " + filter); synchronized (eventFilters) { eventFilters.remove(filter); } diff --git a/jdk/src/share/classes/java/awt/EventQueue.java b/jdk/src/share/classes/java/awt/EventQueue.java index 86c68e8b5c7..ffda53b69e7 100644 --- a/jdk/src/share/classes/java/awt/EventQueue.java +++ b/jdk/src/share/classes/java/awt/EventQueue.java @@ -883,6 +883,41 @@ public class EventQueue { } } + /** + * Creates a new {@code secondary loop} associated with this + * event queue. Use the {@link SecondaryLoop#enter} and + * {@link SecondaryLoop#exit} methods to start and stop the + * event loop and dispatch the events from this queue. + * + * @return secondaryLoop A new secondary loop object, which can + * be used to launch a new nested event + * loop and dispatch events from this queue + * + * @see SecondaryLoop#enter + * @see SecondaryLoop#exit + * + * @since 1.7 + */ + public SecondaryLoop createSecondaryLoop() { + return createSecondaryLoop(null, null, 0); + } + + SecondaryLoop createSecondaryLoop(Conditional cond, EventFilter filter, long interval) { + pushPopLock.lock(); + try { + if (nextQueue != null) { + // Forward the request to the top of EventQueue stack + return nextQueue.createSecondaryLoop(cond, filter, interval); + } + if (dispatchThread == null) { + initDispatchThread(); + } + return new WaitDispatchSupport(dispatchThread, cond, filter, interval); + } finally { + pushPopLock.unlock(); + } + } + /** * Returns true if the calling thread is * {@link Toolkit#getSystemEventQueue the current AWT EventQueue}'s diff --git a/jdk/src/share/classes/java/awt/SecondaryLoop.java b/jdk/src/share/classes/java/awt/SecondaryLoop.java new file mode 100644 index 00000000000..844efc85261 --- /dev/null +++ b/jdk/src/share/classes/java/awt/SecondaryLoop.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.awt; + +/** + * A helper interface to run the nested event loop. + *

+ * Objects that implement this interface are created with the + * {@link EventQueue#createSecondaryLoop} method. The interface + * provides two methods, {@link enter} and {@link exit}, + * which can be used to start and stop the event loop. + *

+ * When the {@link enter} method is called, the current + * thread is blocked until the loop is terminated by the + * {@link exit} method. Also, a new event loop is started + * on the event dispatch thread, which may or may not be + * the current thread. The loop can be terminated on any + * thread by calling its {@link exit} method. After the + * loop is terminated, the {@code SecondaryLoop} object can + * be reused to run a new nested event loop. + *

+ * A typical use case of applying this interface is AWT + * and Swing modal dialogs. When a modal dialog is shown on + * the event dispatch thread, it enters a new secondary loop. + * Later, when the dialog is hidden or disposed, it exits + * the loop, and the thread continues its execution. + *

+ * The following example illustrates a simple use case of + * secondary loops: + * + *

+ *   SecondaryLoop loop;
+ *
+ *   JButton jButton = new JButton("Button");
+ *   jButton.addActionListener(new ActionListener() {
+ *       {@code @Override}
+ *       public void actionPerformed(ActionEvent e) {
+ *           Toolkit tk = Toolkit.getDefaultToolkit();
+ *           EventQueue eq = tk.getSystemEventQueue();
+ *           loop = eq.createSecondaryLoop();
+ *
+ *           // Spawn a new thread to do the work
+ *           Thread worker = new WorkerThread();
+ *           worker.start();
+ *
+ *           // Enter the loop to block the current event
+ *           // handler, but leave UI responsive
+ *           if (!loop.enter()) {
+ *               // Report an error
+ *           }
+ *       }
+ *   });
+ *
+ *   class WorkerThread extends Thread {
+ *       {@code @Override}
+ *       public void run() {
+ *           // Perform calculations
+ *           doSomethingUseful();
+ *
+ *           // Exit the loop
+ *           loop.exit();
+ *       }
+ *   }
+ * 
+ * + * @see Dialog#show + * @see EventQueue#createSecondaryLoop + * @see Toolkit#getSystemEventQueue + * + * @author Anton Tarasov, Artem Ananiev + * + * @since 1.7 + */ +public interface SecondaryLoop { + + /** + * Blocks the execution of the current thread and enters a new + * secondary event loop on the event dispatch thread. + *

+ * This method can be called by any thread including the event + * dispatch thread. This thread will be blocked until the {@link + * exit} method is called or the loop is terminated. A new + * secondary loop will be created on the event dispatch thread + * for dispatching events in either case. + *

+ * This method can only start one new event loop at a time per + * object. If a secondary event loop has already been started + * by this object and is currently still running, this method + * returns {@code false} to indicate that it was not successful + * in starting a new event loop. Otherwise, this method blocks + * the calling thread and later returns {@code true} when the + * new event loop is terminated. At such time, this object can + * again be used to start another new event loop. + * + * @return {@code true} after termination of the secondary loop, + * if the secondary loop was started by this call, + * {@code false} otherwise + */ + public boolean enter(); + + /** + * Unblocks the execution of the thread blocked by the {@link + * enter} method and exits the secondary loop. + *

+ * This method resumes the thread that called the {@link enter} + * method and exits the secondary loop that was created when + * the {@link enter} method was invoked. + *

+ * Note that if any other secondary loop is started while this + * loop is running, the blocked thread will not resume execution + * until the nested loop is terminated. + *

+ * If this secondary loop has not been started with the {@link + * enter} method, or this secondary loop has already finished + * with the {@link exit} method, this method returns {@code + * false}, otherwise {@code true} is returned. + * + * @return {@code true} if this loop was previously started and + * has not yet been finished with the {@link exit} method, + * {@code false} otherwise + */ + public boolean exit(); + +} diff --git a/jdk/src/share/classes/java/awt/WaitDispatchSupport.java b/jdk/src/share/classes/java/awt/WaitDispatchSupport.java new file mode 100644 index 00000000000..bf77fa73a62 --- /dev/null +++ b/jdk/src/share/classes/java/awt/WaitDispatchSupport.java @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.awt; + +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicBoolean; + +import java.security.PrivilegedAction; +import java.security.AccessController; + +import sun.awt.PeerEvent; + +import sun.util.logging.PlatformLogger; + +/** + * This utility class is used to suspend execution on a thread + * while still allowing {@code EventDispatchThread} to dispatch events. + * The API methods of the class are thread-safe. + * + * @author Anton Tarasov, Artem Ananiev + * + * @since 1.7 + */ +class WaitDispatchSupport implements SecondaryLoop { + + private final static PlatformLogger log = + PlatformLogger.getLogger("java.awt.event.WaitDispatchSupport"); + + private EventDispatchThread dispatchThread; + private EventFilter filter; + + private volatile Conditional extCondition; + private volatile Conditional condition; + + private long interval; + // Use a shared daemon timer to serve all the WaitDispatchSupports + private static Timer timer; + // When this WDS expires, we cancel the timer task leaving the + // shared timer up and running + private TimerTask timerTask; + + private AtomicBoolean keepBlockingEDT = new AtomicBoolean(false); + private AtomicBoolean keepBlockingCT = new AtomicBoolean(false); + + private static synchronized void initializeTimer() { + if (timer == null) { + timer = new Timer("AWT-WaitDispatchSupport-Timer", true); + } + } + + /** + * Creates a {@code WaitDispatchSupport} instance to + * serve the given event dispatch thread. + * + * @param dispatchThread An event dispatch thread that + * should not stop dispatching events while waiting + * + * @since 1.7 + */ + public WaitDispatchSupport(EventDispatchThread dispatchThread) { + this(dispatchThread, null); + } + + /** + * Creates a {@code WaitDispatchSupport} instance to + * serve the given event dispatch thread. + * + * @param dispatchThread An event dispatch thread that + * should not stop dispatching events while waiting + * @param extCondition A conditional object used to determine + * if the loop should be terminated + * + * @since 1.7 + */ + public WaitDispatchSupport(EventDispatchThread dispatchThread, + Conditional extCond) + { + if (dispatchThread == null) { + throw new IllegalArgumentException("The dispatchThread can not be null"); + } + + this.dispatchThread = dispatchThread; + this.extCondition = extCond; + this.condition = new Conditional() { + @Override + public boolean evaluate() { + if (log.isLoggable(PlatformLogger.FINEST)) { + log.finest("evaluate(): blockingEDT=" + keepBlockingEDT.get() + + ", blockingCT=" + keepBlockingCT.get()); + } + boolean extEvaluate = + (extCondition != null) ? extCondition.evaluate() : true; + if (!keepBlockingEDT.get() || !extEvaluate) { + if (timerTask != null) { + timerTask.cancel(); + timerTask = null; + } + return false; + } + return true; + } + }; + } + + /** + * Creates a {@code WaitDispatchSupport} instance to + * serve the given event dispatch thread. + *

+ * The {@link EventFilter} is set on the {@code dispatchThread} + * while waiting. The filter is removed on completion of the + * waiting process. + *

+ * + * + * @param dispatchThread An event dispatch thread that + * should not stop dispatching events while waiting + * @param filter {@code EventFilter} to be set + * @param interval A time interval to wait for. Note that + * when the waiting process takes place on EDT + * there is no guarantee to stop it in the given time + * + * @since 1.7 + */ + public WaitDispatchSupport(EventDispatchThread dispatchThread, + Conditional extCondition, + EventFilter filter, long interval) + { + this(dispatchThread, extCondition); + this.filter = filter; + if (interval < 0) { + throw new IllegalArgumentException("The interval value must be >= 0"); + } + this.interval = interval; + if (interval != 0) { + initializeTimer(); + } + } + + /** + * @inheritDoc + */ + @Override + public boolean enter() { + log.fine("enter(): blockingEDT=" + keepBlockingEDT.get() + + ", blockingCT=" + keepBlockingCT.get()); + + if (!keepBlockingEDT.compareAndSet(false, true)) { + log.fine("The secondary loop is already running, aborting"); + return false; + } + + final Runnable run = new Runnable() { + public void run() { + log.fine("Starting a new event pump"); + if (filter == null) { + dispatchThread.pumpEvents(condition); + } else { + dispatchThread.pumpEventsForFilter(condition, filter); + } + } + }; + + // We have two mechanisms for blocking: if we're on the + // dispatch thread, start a new event pump; if we're + // on any other thread, call wait() on the treelock + + Thread currentThread = Thread.currentThread(); + if (currentThread == dispatchThread) { + log.finest("On dispatch thread: " + dispatchThread); + if (interval != 0) { + log.finest("scheduling the timer for " + interval + " ms"); + timer.schedule(timerTask = new TimerTask() { + @Override + public void run() { + if (keepBlockingEDT.compareAndSet(true, false)) { + wakeupEDT(); + } + } + }, interval); + } + // Dispose SequencedEvent we are dispatching on the the current + // AppContext, to prevent us from hang - see 4531693 for details + SequencedEvent currentSE = KeyboardFocusManager. + getCurrentKeyboardFocusManager().getCurrentSequencedEvent(); + if (currentSE != null) { + log.fine("Dispose current SequencedEvent: " + currentSE); + currentSE.dispose(); + } + // In case the exit() method is called before starting + // new event pump it will post the waking event to EDT. + // The event will be handled after the the new event pump + // starts. Thus, the enter() method will not hang. + // + // Event pump should be privileged. See 6300270. + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + run.run(); + return null; + } + }); + } else { + log.finest("On non-dispatch thread: " + currentThread); + synchronized (getTreeLock()) { + if (filter != null) { + dispatchThread.addEventFilter(filter); + } + try { + EventQueue eq = dispatchThread.getEventQueue(); + eq.postEvent(new PeerEvent(this, run, PeerEvent.PRIORITY_EVENT)); + keepBlockingCT.set(true); + if (interval > 0) { + long currTime = System.currentTimeMillis(); + while (keepBlockingCT.get() && + ((extCondition != null) ? extCondition.evaluate() : true) && + (currTime + interval > System.currentTimeMillis())) + { + getTreeLock().wait(interval); + } + } else { + while (keepBlockingCT.get() && + ((extCondition != null) ? extCondition.evaluate() : true)) + { + getTreeLock().wait(); + } + } + log.fine("waitDone " + keepBlockingEDT.get() + " " + keepBlockingCT.get()); + } catch (InterruptedException e) { + log.fine("Exception caught while waiting: " + e); + } finally { + if (filter != null) { + dispatchThread.removeEventFilter(filter); + } + } + // If the waiting process has been stopped because of the + // time interval passed or an exception occurred, the state + // should be changed + keepBlockingEDT.set(false); + keepBlockingCT.set(false); + } + } + + return true; + } + + /** + * @inheritDoc + */ + public boolean exit() { + log.fine("exit(): blockingEDT=" + keepBlockingEDT.get() + + ", blockingCT=" + keepBlockingCT.get()); + if (keepBlockingEDT.compareAndSet(true, false)) { + wakeupEDT(); + return true; + } + return false; + } + + private final static Object getTreeLock() { + return Component.LOCK; + } + + private final Runnable wakingRunnable = new Runnable() { + public void run() { + log.fine("Wake up EDT"); + synchronized (getTreeLock()) { + keepBlockingCT.set(false); + getTreeLock().notifyAll(); + } + log.fine("Wake up EDT done"); + } + }; + + private void wakeupEDT() { + log.finest("wakeupEDT(): EDT == " + dispatchThread); + EventQueue eq = dispatchThread.getEventQueue(); + eq.postEvent(new PeerEvent(this, wakingRunnable, PeerEvent.PRIORITY_EVENT)); + } +} diff --git a/jdk/test/java/awt/EventQueue/SecondaryLoopTest/SecondaryLoopTest.java b/jdk/test/java/awt/EventQueue/SecondaryLoopTest/SecondaryLoopTest.java new file mode 100644 index 00000000000..9dd251222a5 --- /dev/null +++ b/jdk/test/java/awt/EventQueue/SecondaryLoopTest/SecondaryLoopTest.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + @test + @bug 6949936 + @author Artem Ananiev: area=eventqueue + @run main/timeout=30 SecondaryLoopTest +*/ + +import java.awt.*; + +/** + * Unit test for java.awt.SecondaryLoop implementation + */ +public class SecondaryLoopTest { + + private static volatile boolean loopStarted; + private static volatile boolean doubleEntered; + private static volatile boolean loopActive; + private static volatile boolean eventDispatched; + + public static void main(String[] args) throws Exception { + test(true, true); + test(true, false); + test(false, true); + test(false, false); + } + + private static void test(final boolean enterEDT, final boolean exitEDT) throws Exception { + System.out.println("Running test(" + enterEDT + ", " + exitEDT + ")"); + System.err.flush(); + loopStarted = true; + Runnable enterRun = new Runnable() { + @Override + public void run() { + Toolkit tk = Toolkit.getDefaultToolkit(); + EventQueue eq = tk.getSystemEventQueue(); + final SecondaryLoop loop = eq.createSecondaryLoop(); + doubleEntered = false; + eventDispatched = false; + Runnable eventRun = new Runnable() { + @Override + public void run() { + // Let the loop enter + sleep(1000); + if (loop.enter()) { + doubleEntered = true; + } + eventDispatched = true; + } + }; + EventQueue.invokeLater(eventRun); + Runnable exitRun = new Runnable() { + @Override + public void run() { + // Let the loop enter and eventRun finish + sleep(2000); + if (doubleEntered) { + // Hopefully, we get here if the loop is entered twice + loop.exit(); + } + loop.exit(); + } + }; + if (exitEDT) { + EventQueue.invokeLater(exitRun); + } else { + new Thread(exitRun).start(); + } + if (!loop.enter()) { + loopStarted = false; + } + loopActive = eventDispatched; + } + }; + if (enterEDT) { + EventQueue.invokeAndWait(enterRun); + } else { + enterRun.run(); + } + // Print all the flags before we fail with exception + System.out.println(" loopStarted = " + loopStarted); + System.out.println(" doubleEntered = " + doubleEntered); + System.out.println(" loopActive = " + loopActive); + System.out.flush(); + if (!loopStarted) { + throw new RuntimeException("Test FAILED: the secondary loop is not started"); + } + if (doubleEntered) { + throw new RuntimeException("Test FAILED: the secondary loop is started twice"); + } + if (!loopActive) { + throw new RuntimeException("Test FAILED: the secondary loop exited immediately"); + } + } + + private static void sleep(long t) { + try { + Thread.sleep(t); + } catch (InterruptedException e) { + e.printStackTrace(System.err); + } + } + +} From e0b5ab6bcb7b3a3ea1a87603e805efa328e4b2a3 Mon Sep 17 00:00:00 2001 From: Gary Benson Date: Tue, 24 Aug 2010 13:27:45 +0100 Subject: [PATCH 003/128] 6976186: Integrate Shark Shark is a JIT compiler for Zero that uses the LLVM compiler infrastructure. Reviewed-by: ohair --- make/hotspot-rules.gmk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/make/hotspot-rules.gmk b/make/hotspot-rules.gmk index 72d6f14152d..9a85b93f990 100644 --- a/make/hotspot-rules.gmk +++ b/make/hotspot-rules.gmk @@ -73,7 +73,11 @@ ifeq ($(DEBUG_NAME), fastdebug) endif ifeq ($(ZERO_BUILD), true) - HOTSPOT_TARGET := $(HOTSPOT_TARGET)zero + ifeq ($(SHARK_BUILD), true) + HOTSPOT_TARGET := $(HOTSPOT_TARGET)shark + else + HOTSPOT_TARGET := $(HOTSPOT_TARGET)zero + endif endif HOTSPOT_BUILD_ARGUMENTS += $(COMMON_BUILD_ARGUMENTS) From d6c5c969f07a7bb0f02f81bfcbc2e9d6a46747c7 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 24 Aug 2010 11:31:00 -0700 Subject: [PATCH 004/128] 6935638: -implicit:none prevents compilation with annotation processing Reviewed-by: darcy --- .../sun/tools/javac/main/JavaCompiler.java | 9 ++ .../processing/options/TestImplicitNone.java | 109 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 langtools/test/tools/javac/processing/options/TestImplicitNone.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java index bee5cf29966..70ba262411b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -916,6 +916,15 @@ public class JavaCompiler implements ClassReader.SourceCompleter { } rootClasses = cdefs.toList(); } + + // Ensure the input files have been recorded. Although this is normally + // done by readSource, it may not have been done if the trees were read + // in a prior round of annotation processing, and the trees have been + // cleaned and are being reused. + for (JCCompilationUnit unit : roots) { + inputFiles.add(unit.sourcefile); + } + return roots; } diff --git a/langtools/test/tools/javac/processing/options/TestImplicitNone.java b/langtools/test/tools/javac/processing/options/TestImplicitNone.java new file mode 100644 index 00000000000..159e815bc5b --- /dev/null +++ b/langtools/test/tools/javac/processing/options/TestImplicitNone.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6935638 + * @summary -implicit:none prevents compilation with annotation processing + */ + +import java.io.*; +import java.util.*; +import javax.annotation.processing.*; +import javax.lang.model.*; +import javax.lang.model.element.*; + + +@SupportedAnnotationTypes("*") +public class TestImplicitNone extends AbstractProcessor { + public static void main(String... args) throws Exception { + new TestImplicitNone().run(); + } + + void run() throws Exception { + File classesDir = new File("tmp", "classes"); + classesDir.mkdirs(); + File test_java = new File(new File("tmp", "src"), "Test.java"); + writeFile(test_java, "class Test { }"); + + // build up list of options and files to be compiled + List opts = new ArrayList(); + List files = new ArrayList(); + + opts.add("-d"); + opts.add(classesDir.getPath()); + opts.add("-processorpath"); + opts.add(System.getProperty("test.classes")); + opts.add("-implicit:none"); + opts.add("-processor"); + opts.add(TestImplicitNone.class.getName()); + files.add(test_java); + + compile(opts, files); + + File test_class = new File(classesDir, "Test.class"); + if (!test_class.exists()) + throw new Exception("Test.class not generated"); + } + + /** Compile files with options provided. */ + void compile(List opts, List files) throws Exception { + System.err.println("javac: " + opts + " " + files); + List args = new ArrayList(); + args.addAll(opts); + for (File f: files) + args.add(f.getPath()); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javac.Main.compile(args.toArray(new String[args.size()]), pw); + pw.flush(); + if (sw.getBuffer().length() > 0) + System.err.println(sw.toString()); + if (rc != 0) + throw new Exception("compilation failed: rc=" + rc); + } + + /** Write a file with a given body. */ + void writeFile(File f, String body) throws Exception { + if (f.getParentFile() != null) + f.getParentFile().mkdirs(); + Writer out = new FileWriter(f); + try { + out.write(body); + } finally { + out.close(); + } + } + + //----- annotation processor methods ----- + + public boolean process(Set annotations, + RoundEnvironment roundEnv) { + return true; + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } +} From 19a9622303124b0e6746d38cf26a111a867f5861 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Tue, 24 Aug 2010 15:09:21 -0700 Subject: [PATCH 005/128] 6929404: Filer.getResource(SOURCE_PATH, ...) does not work when -sourcepath contains >1 entry Reviewed-by: darcy --- .../tools/javac/processing/JavacFiler.java | 14 +- .../processing/filer/TestGetResource2.java | 172 ++++++++++++++++++ 2 files changed, 182 insertions(+), 4 deletions(-) create mode 100644 langtools/test/tools/javac/processing/filer/TestGetResource2.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacFiler.java b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacFiler.java index 4be0863bd64..6b9ec8e1e54 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacFiler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacFiler.java @@ -34,6 +34,7 @@ import javax.lang.model.element.Element; import java.util.*; import java.io.Closeable; +import java.io.FileNotFoundException; import java.io.InputStream; import java.io.OutputStream; import java.io.FilterOutputStream; @@ -450,10 +451,15 @@ public class JavacFiler implements Filer, Closeable { // TODO: Only support reading resources in selected output // locations? Only allow reading of non-source, non-class // files from the supported input locations? - FileObject fileObject = fileManager.getFileForOutput(location, - pkg.toString(), - relativeName.toString(), - null); + FileObject fileObject = fileManager.getFileForInput(location, + pkg.toString(), + relativeName.toString()); + if (fileObject == null) { + String name = (pkg.length() == 0) + ? relativeName.toString() : (pkg + "/" + relativeName); + throw new FileNotFoundException(name); + } + // If the path was already opened for writing, throw an exception. checkFileReopening(fileObject, false); return new FilerInputFileObject(fileObject); diff --git a/langtools/test/tools/javac/processing/filer/TestGetResource2.java b/langtools/test/tools/javac/processing/filer/TestGetResource2.java new file mode 100644 index 00000000000..49befdf4e34 --- /dev/null +++ b/langtools/test/tools/javac/processing/filer/TestGetResource2.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 6929404 + * @summary Filer.getResource(SOURCE_PATH, ...) does not work when -sourcepath contains >1 entry + */ + +import java.io.*; +import java.security.*; +import java.util.*; +import javax.annotation.processing.*; +import javax.lang.model.*; +import javax.lang.model.element.*; +import javax.tools.*; +import javax.tools.Diagnostic.Kind; +import javax.tools.JavaCompiler.CompilationTask; + +public class TestGetResource2 { + + public static void main(String[] args) throws Exception { + new TestGetResource2().run(); + } + + void run() throws Exception { + JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); + CodeSource cs = javac.getClass().getProtectionDomain().getCodeSource(); + if (cs == null) { + System.err.println("got compiler from " + + ClassLoader.getSystemResource(javac.getClass().getName().replace(".", "/")+".class")); + } else { + System.err.println("got compiler from " + cs.getLocation()); + } + + testSingleSourceDir(javac); + testCompositeSourcePath(javac); + testMissingResource(javac); + } + + private void testSingleSourceDir(JavaCompiler javac) throws Exception { + System.err.println("testSingleSourceDir"); + File tmpdir = new File("testSingleSourceDir"); + File srcdir = new File(tmpdir, "src"); + File destdir = new File(tmpdir, "dest"); + write(srcdir, "pkg/X.java", "package pkg; class X {}"); + write(srcdir, "resources/file.txt", "hello"); + destdir.mkdirs(); + + CompilationTask task = javac.getTask(null, null, null, + Arrays.asList("-sourcepath", srcdir.toString(), "-d", destdir.toString()), + Collections.singleton("pkg.X"), null); + task.setProcessors(Collections.singleton(new AnnoProc())); + boolean result = task.call(); + System.err.println("javac result with single source dir: " + result); + expect(result, true); + } + + private void testCompositeSourcePath(JavaCompiler javac) throws Exception { + System.err.println("testCompositeSearchPath"); + File tmpdir = new File("testCompositeSourcePath"); + File srcdir = new File(tmpdir, "src"); + File rsrcdir = new File(tmpdir, "rsrc"); + File destdir = new File(tmpdir, "dest"); + write(srcdir, "pkg/X.java", "package pkg; class X {}"); + write(rsrcdir, "resources/file.txt", "hello"); + destdir.mkdirs(); + + CompilationTask task = javac.getTask(null, null, null, + Arrays.asList("-sourcepath", srcdir + File.pathSeparator + rsrcdir, "-d", destdir.toString()), + Collections.singleton("pkg.X"), null); + task.setProcessors(Collections.singleton(new AnnoProc())); + boolean result = task.call(); + System.err.println("javac result with composite source path: " + result); + expect(result, true); + } + + private void testMissingResource(JavaCompiler javac) throws Exception { + System.err.println("testMissingResource"); + File tmpdir = new File("testMissingResource"); + File srcdir = new File(tmpdir, "src"); + File destdir = new File(tmpdir, "dest"); + write(srcdir, "pkg/X.java", "package pkg; class X {}"); + destdir.mkdirs(); + + CompilationTask task = javac.getTask(null, null, null, + Arrays.asList("-sourcepath", srcdir.toString(), "-d", destdir.toString()), + Collections.singleton("pkg.X"), null); + task.setProcessors(Collections.singleton(new AnnoProc())); + boolean result = task.call(); + System.err.println("javac result when missing resource: " + result); + expect(result, false); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + @SupportedAnnotationTypes("*") + static class AnnoProc extends AbstractProcessor { + + public @Override boolean process(Set annotations, RoundEnvironment roundEnv) { + if (roundEnv.processingOver()) { + return false; + } + + try { + FileObject resource = processingEnv.getFiler().getResource(StandardLocation.SOURCE_PATH, "resources", "file.txt"); + try { + resource.openInputStream().close(); + processingEnv.getMessager().printMessage(Kind.NOTE, "found: " + resource.toUri()); + return true; + } catch (IOException x) { + processingEnv.getMessager().printMessage(Kind.ERROR, "could not read: " + resource.toUri()); + x.printStackTrace(); + } + } catch (IOException x) { + processingEnv.getMessager().printMessage(Kind.ERROR, "did not find resource"); + x.printStackTrace(); + } + + return false; + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } + } + + private File write(File dir, String path, String contents) throws IOException { + File f = new File(dir, path); + f.getParentFile().mkdirs(); + Writer w = new FileWriter(f); + try { + w.write(contents); + } finally { + w.close(); + } + return f; + } + + void expect(boolean val, boolean expect) { + if (val != expect) + error("Unexpected value: " + val + "; expected: " + expect); + } + + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors = 0; +} From 0e1661c2f15e2323b98ccb69b960dec6c97ede87 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Wed, 25 Aug 2010 11:24:30 -0700 Subject: [PATCH 006/128] 6979564: ":" for path separator in dist/bin/javac does not work on Windows Reviewed-by: jjh --- langtools/make/build.xml | 1 + langtools/src/share/bin/launcher.sh-template | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/langtools/make/build.xml b/langtools/make/build.xml index d269f396534..b15e779e395 100644 --- a/langtools/make/build.xml +++ b/langtools/make/build.xml @@ -673,6 +673,7 @@ + diff --git a/langtools/src/share/bin/launcher.sh-template b/langtools/src/share/bin/launcher.sh-template index d208c34103d..c912f83fad4 100644 --- a/langtools/src/share/bin/launcher.sh-template +++ b/langtools/src/share/bin/launcher.sh-template @@ -40,8 +40,8 @@ mylib="`dirname $mydir`"/lib if [ "$LANGTOOLS_USE_BOOTCLASSPATH" != "no" ]; then cp=`unzip -c "$mylib/#PROGRAM#.jar" META-INF/MANIFEST.MF | grep "Class-Path:" | - sed -e 's|Class-Path: *||' -e 's|\([a-z]*\.jar\) *|'"$mylib"'/\1:|g'` - bcp="$mylib/#PROGRAM#.jar":$cp + sed -e 's|Class-Path: *||' -e 's|\([a-z]*\.jar\) *|'"$mylib"'/\1#PS#|g'` + bcp="$mylib/#PROGRAM#.jar#PS#$cp" fi # tools currently assumes that assertions are enabled in the launcher From 37fcc133f61b24db6d5877b7584e9906955b6369 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Wed, 25 Aug 2010 11:40:25 -0700 Subject: [PATCH 007/128] 6960424: new option -Xpkginfo for better control of when package-info.class is generated Reviewed-by: mcimadamore --- .../com/sun/tools/javac/code/Attribute.java | 7 + .../com/sun/tools/javac/code/Types.java | 21 +++ .../com/sun/tools/javac/comp/Enter.java | 7 +- .../com/sun/tools/javac/comp/Lower.java | 22 ++- .../com/sun/tools/javac/jvm/ClassWriter.java | 34 +--- .../com/sun/tools/javac/main/OptionName.java | 1 + .../tools/javac/main/RecognizedOptions.java | 15 ++ .../tools/javac/resources/javac.properties | 6 +- langtools/test/tools/javac/TestPkgInfo.java | 174 ++++++++++++++++++ 9 files changed, 255 insertions(+), 32 deletions(-) create mode 100644 langtools/test/tools/javac/TestPkgInfo.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java index 381418e76c6..0ee13841f59 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java @@ -295,4 +295,11 @@ public abstract class Attribute implements AnnotationValue { void visitEnum(Attribute.Enum e); void visitError(Attribute.Error e); } + + /** A mirror of java.lang.annotation.RetentionPolicy. */ + public static enum RetentionPolicy { + SOURCE, + CLASS, + RUNTIME + } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java index 051e88ab028..57b49b821c2 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java @@ -32,6 +32,7 @@ import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.List; import com.sun.tools.javac.jvm.ClassReader; +import com.sun.tools.javac.code.Attribute.RetentionPolicy; import com.sun.tools.javac.comp.Check; import static com.sun.tools.javac.code.Type.*; @@ -3554,4 +3555,24 @@ public class Types { public Type visitType(Type t, S s) { return t; } } // + + + // + + public RetentionPolicy getRetention(Attribute.Compound a) { + RetentionPolicy vis = RetentionPolicy.CLASS; // the default + Attribute.Compound c = a.type.tsym.attribute(syms.retentionType.tsym); + if (c != null) { + Attribute value = c.member(names.value); + if (value != null && value instanceof Attribute.Enum) { + Name levelName = ((Attribute.Enum)value).value.name; + if (levelName == names.SOURCE) vis = RetentionPolicy.SOURCE; + else if (levelName == names.CLASS) vis = RetentionPolicy.CLASS; + else if (levelName == names.RUNTIME) vis = RetentionPolicy.RUNTIME; + else ;// /* fail soft */ throw new AssertionError(levelName); + } + } + return vis; + } + // } diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java index 94d62b3c16a..e8f26e6ae15 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java @@ -38,6 +38,7 @@ import com.sun.tools.javac.util.List; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.main.RecognizedOptions.PkgInfo; import com.sun.tools.javac.tree.JCTree.*; import static com.sun.tools.javac.code.Flags.*; @@ -102,6 +103,7 @@ public class Enter extends JCTree.Visitor { Lint lint; Names names; JavaFileManager fileManager; + PkgInfo pkginfoOpt; private final Todo todo; @@ -132,6 +134,9 @@ public class Enter extends JCTree.Visitor { predefClassDef.sym = syms.predefClass; todo = Todo.instance(context); fileManager = context.get(JavaFileManager.class); + + Options options = Options.instance(context); + pkginfoOpt = PkgInfo.get(options); } /** A hashtable mapping classes and packages to the environments current @@ -278,7 +283,7 @@ public class Enter extends JCTree.Visitor { JavaFileObject.Kind.SOURCE); if (tree.pid != null) { tree.packge = reader.enterPackage(TreeInfo.fullName(tree.pid)); - if (tree.packageAnnotations.nonEmpty()) { + if (tree.packageAnnotations.nonEmpty() || pkginfoOpt == PkgInfo.ALWAYS) { if (isPkgInfo) { addEnv = true; } else { diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java index c5434eaf062..813b3500d2c 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java @@ -29,6 +29,7 @@ import java.util.*; import com.sun.tools.javac.code.*; import com.sun.tools.javac.jvm.*; +import com.sun.tools.javac.main.RecognizedOptions.PkgInfo; import com.sun.tools.javac.tree.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; @@ -82,6 +83,7 @@ public class Lower extends TreeTranslator { private final Name classDollar; private Types types; private boolean debugLower; + private PkgInfo pkginfoOpt; protected Lower(Context context) { context.put(lowerKey, this); @@ -106,6 +108,7 @@ public class Lower extends TreeTranslator { types = Types.instance(context); Options options = Options.instance(context); debugLower = options.get("debuglower") != null; + pkginfoOpt = PkgInfo.get(options); } /** The currently enclosing class. @@ -2161,7 +2164,7 @@ public class Lower extends TreeTranslator { } public void visitTopLevel(JCCompilationUnit tree) { - if (tree.packageAnnotations.nonEmpty()) { + if (needPackageInfoClass(tree)) { Name name = names.package_info; long flags = Flags.ABSTRACT | Flags.INTERFACE; if (target.isPackageInfoSynthetic()) @@ -2183,6 +2186,23 @@ public class Lower extends TreeTranslator { translated.append(packageAnnotationsClass); } } + // where + private boolean needPackageInfoClass(JCCompilationUnit tree) { + switch (pkginfoOpt) { + case ALWAYS: + return true; + case LEGACY: + return tree.packageAnnotations.nonEmpty(); + case NONEMPTY: + for (Attribute.Compound a: tree.packge.attributes_field) { + Attribute.RetentionPolicy p = types.getRetention(a); + if (p != Attribute.RetentionPolicy.SOURCE) + return true; + } + return false; + } + throw new AssertionError(); + } public void visitClassDef(JCClassDecl tree) { ClassSymbol currentClassPrev = currentClass; diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java index e0af0d914f9..ff5db102d6f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java @@ -34,6 +34,7 @@ import javax.tools.FileObject; import javax.tools.JavaFileObject; import com.sun.tools.javac.code.*; +import com.sun.tools.javac.code.Attribute.RetentionPolicy; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.file.BaseFileObject; @@ -692,7 +693,7 @@ public class ClassWriter extends ClassFile { boolean hasInvisible = false; if (m.params != null) for (VarSymbol s : m.params) { for (Attribute.Compound a : s.getAnnotationMirrors()) { - switch (getRetention(a.type.tsym)) { + switch (types.getRetention(a)) { case SOURCE: break; case CLASS: hasInvisible = true; break; case RUNTIME: hasVisible = true; break; @@ -708,7 +709,7 @@ public class ClassWriter extends ClassFile { for (VarSymbol s : m.params) { ListBuffer buf = new ListBuffer(); for (Attribute.Compound a : s.getAnnotationMirrors()) - if (getRetention(a.type.tsym) == RetentionPolicy.RUNTIME) + if (types.getRetention(a) == RetentionPolicy.RUNTIME) buf.append(a); databuf.appendChar(buf.length()); for (Attribute.Compound a : buf) @@ -723,7 +724,7 @@ public class ClassWriter extends ClassFile { for (VarSymbol s : m.params) { ListBuffer buf = new ListBuffer(); for (Attribute.Compound a : s.getAnnotationMirrors()) - if (getRetention(a.type.tsym) == RetentionPolicy.CLASS) + if (types.getRetention(a) == RetentionPolicy.CLASS) buf.append(a); databuf.appendChar(buf.length()); for (Attribute.Compound a : buf) @@ -747,7 +748,7 @@ public class ClassWriter extends ClassFile { ListBuffer visibles = new ListBuffer(); ListBuffer invisibles = new ListBuffer(); for (Attribute.Compound a : attrs) { - switch (getRetention(a.type.tsym)) { + switch (types.getRetention(a)) { case SOURCE: break; case CLASS: invisibles.append(a); break; case RUNTIME: visibles.append(a); break; @@ -785,7 +786,7 @@ public class ClassWriter extends ClassFile { if (tc.position.type == TargetType.UNKNOWN || !tc.position.emitToClassfile()) continue; - switch (getRetention(tc.type.tsym)) { + switch (types.getRetention(tc)) { case SOURCE: break; case CLASS: invisibles.append(tc); break; case RUNTIME: visibles.append(tc); break; @@ -815,29 +816,6 @@ public class ClassWriter extends ClassFile { return attrCount; } - /** A mirror of java.lang.annotation.RetentionPolicy. */ - enum RetentionPolicy { - SOURCE, - CLASS, - RUNTIME - } - - RetentionPolicy getRetention(TypeSymbol annotationType) { - RetentionPolicy vis = RetentionPolicy.CLASS; // the default - Attribute.Compound c = annotationType.attribute(syms.retentionType.tsym); - if (c != null) { - Attribute value = c.member(names.value); - if (value != null && value instanceof Attribute.Enum) { - Name levelName = ((Attribute.Enum)value).value.name; - if (levelName == names.SOURCE) vis = RetentionPolicy.SOURCE; - else if (levelName == names.CLASS) vis = RetentionPolicy.CLASS; - else if (levelName == names.RUNTIME) vis = RetentionPolicy.RUNTIME; - else ;// /* fail soft */ throw new AssertionError(levelName); - } - } - return vis; - } - /** A visitor to write an attribute including its leading * single-character marker. */ diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/OptionName.java b/langtools/src/share/classes/com/sun/tools/javac/main/OptionName.java index 4464845e9fb..c872ef7be14 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/OptionName.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/OptionName.java @@ -80,6 +80,7 @@ public enum OptionName { XMAXERRS("-Xmaxerrs"), XMAXWARNS("-Xmaxwarns"), XSTDOUT("-Xstdout"), + XPKGINFO("-Xpkginfo:"), XPRINT("-Xprint"), XPRINTROUNDS("-XprintRounds"), XPRINTPROCESSORINFO("-XprintProcessorInfo"), diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java b/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java index d6b02484289..5bd6ad2a60f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java @@ -160,6 +160,7 @@ public class RecognizedOptions { XMAXERRS, XMAXWARNS, XSTDOUT, + XPKGINFO, XPRINT, XPRINTROUNDS, XPRINTPROCESSORINFO, @@ -217,6 +218,7 @@ public class RecognizedOptions { XMAXERRS, XMAXWARNS, // XSTDOUT, + XPKGINFO, XPRINT, XPRINTROUNDS, XPRINTPROCESSORINFO, @@ -532,6 +534,9 @@ public class RecognizedOptions { new XOption(XPREFER, "opt.prefer", Option.ChoiceKind.ONEOF, "source", "newer"), + new XOption(XPKGINFO, "opt.pkginfo", + Option.ChoiceKind.ONEOF, "always", "legacy", "nonempty"), + /* -O is a no-op, accepted for backward compatibility. */ new HiddenOption(O), @@ -598,6 +603,16 @@ public class RecognizedOptions { }; } + public enum PkgInfo { + ALWAYS, LEGACY, NONEMPTY; + public static PkgInfo get(Options options) { + String v = options.get(XPKGINFO); + return (v == null + ? PkgInfo.LEGACY + : PkgInfo.valueOf(v.toUpperCase())); + } + } + private static Map getXLintChoices() { Map choices = new LinkedHashMap(); choices.put("all", false); diff --git a/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties b/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties index 3c2966e545d..301288d7d84 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties @@ -74,7 +74,9 @@ javac.opt.Werror=\ javac.opt.A=\ Options to pass to annotation processors javac.opt.implicit=\ - Specify whether or not to generate class files for implicitly referenced files + Specify whether or not to generate class files for implicitly referenced files +javac.opt.pkginfo=\ + Specify handling of package-info files javac.opt.arg.class=\ javac.opt.arg.class.list=\ @@ -189,7 +191,7 @@ javac.msg.usage=\ javac.msg.usage.nonstandard.footer=\ These options are non-standard and subject to change without notice. - + javac.msg.bug=\ An exception has occurred in the compiler ({0}). \ Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) \ diff --git a/langtools/test/tools/javac/TestPkgInfo.java b/langtools/test/tools/javac/TestPkgInfo.java new file mode 100644 index 00000000000..15adff341d9 --- /dev/null +++ b/langtools/test/tools/javac/TestPkgInfo.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6960424 + * @summary new option -Xpkginfo for better control of when package-info.class is generated + */ + +import java.io.*; +import java.util.*; + +public class TestPkgInfo { + enum OptKind { + NONE(null), + ALWAYS("-Xpkginfo:always"), + NONEMPTY("-Xpkginfo:nonempty"), + LEGACY("-Xpkginfo:legacy"); + OptKind(String opt) { this.opt = opt; } + final String opt; + }; + + public static void main(String... args) throws Exception { + new TestPkgInfo().run(args); + } + + public void run(String... args) throws Exception { + boolean[] booleanValues = { false, true }; + for (OptKind ok: OptKind.values()) { + for (boolean sr: booleanValues) { + for (boolean cr: booleanValues) { + for (boolean rr: booleanValues) { + try { + test(ok, sr, cr, rr); + } catch (Exception e) { + error("Exception: " + e); + } + if (errors > 0) throw new AssertionError(); + } + } + } + } + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + void test(OptKind ok, boolean sr, boolean cr, boolean rr) throws Exception { + count++; + System.err.println("Test " + count + ": ok:" + ok + " sr:" + sr + " cr:" + cr + " rr:" + rr); + + StringBuilder sb = new StringBuilder(); + + // create annotated package statement with all combinations of retention policy + if (sr) sb.append("@SR\n"); + if (cr) sb.append("@CR\n"); + if (rr) sb.append("@RR\n"); + sb.append("package p;\n"); + sb.append("\n"); + + sb.append("import java.lang.annotation.*;\n"); + sb.append("@Retention(RetentionPolicy.SOURCE) @interface SR { }\n"); + sb.append("@Retention(RetentionPolicy.CLASS) @interface CR { }\n"); + sb.append("@Retention(RetentionPolicy.RUNTIME) @interface RR { }\n"); + + // test specific tmp directory + File tmpDir = new File("tmp.test" + count); + File classesDir = new File(tmpDir, "classes"); + classesDir.mkdirs(); + File pkginfo_java = new File(new File(tmpDir, "src"), "package-info.java"); + writeFile(pkginfo_java, sb.toString()); + + // build up list of options and files to be compiled + List opts = new ArrayList(); + List files = new ArrayList(); + + opts.add("-d"); + opts.add(classesDir.getPath()); + if (ok.opt != null) + opts.add(ok.opt); + //opts.add("-verbose"); + files.add(pkginfo_java); + + compile(opts, files); + + File pkginfo_class = new File(new File(classesDir, "p"), "package-info.class"); + boolean exists = pkginfo_class.exists(); + + boolean expected; + switch (ok) { + case ALWAYS: + expected = true; + break; + + case LEGACY: + case NONE: + expected = (sr || cr || rr ); // any annotation + break; + + case NONEMPTY: + expected = (cr || rr ); // any annotation in class file + break; + + default: + throw new IllegalStateException(); + } + + if (exists && !expected) + error("package-info.class found but not expected"); + if (!exists && expected) + error("package-info.class expected but not found"); + } + + /** Compile files with options provided. */ + void compile(List opts, List files) throws Exception { + System.err.println("javac: " + opts + " " + files); + List args = new ArrayList(); + args.addAll(opts); + for (File f: files) + args.add(f.getPath()); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javac.Main.compile(args.toArray(new String[args.size()]), pw); + pw.flush(); + if (sw.getBuffer().length() > 0) + System.err.println(sw.toString()); + if (rc != 0) + throw new Exception("compilation failed: rc=" + rc); + } + + /** Write a file with a given body. */ + void writeFile(File f, String body) throws Exception { + if (f.getParentFile() != null) + f.getParentFile().mkdirs(); + Writer out = new FileWriter(f); + try { + out.write(body); + } finally { + out.close(); + } + } + + /** Report an error. */ + void error(String msg) { + System.err.println("Error: " + msg); + errors++; + } + + /** Test case counter. */ + int count; + + /** Number of errors found. */ + int errors; +} From 34fda8a36d526f8834d98fcab2ee3770ab7e7f85 Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Wed, 25 Aug 2010 15:31:46 -0700 Subject: [PATCH 008/128] 6875847: Java Locale Enhancement Fix for javac to allow "sun.util.locale" package accessible. Reviewed-by: jjg --- .../classes/com/sun/tools/javac/resources/legacy.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties b/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties index 40838469a81..f94bbfe68e0 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/legacy.properties @@ -565,6 +565,7 @@ sun.tools.jar = tiger legacy sun.tools.jar.resources = tiger legacy sun.util = tiger legacy sun.util.calendar = tiger legacy +sun.util.locale = tiger legacy sun.util.logging.resources = tiger legacy sunw.io = tiger legacy sunw.util = tiger legacy From 0f3dd95156a3652b614380a96ade5ba7bb25860a Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Wed, 25 Aug 2010 15:35:45 -0700 Subject: [PATCH 009/128] 6980019: Finish rename of ARM -> try-with-resources in jdk repository Reviewed-by: jjg --- jdk/src/share/classes/java/lang/AutoCloseable.java | 4 ++-- jdk/src/share/classes/java/lang/Throwable.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/jdk/src/share/classes/java/lang/AutoCloseable.java b/jdk/src/share/classes/java/lang/AutoCloseable.java index 18c28fe887b..a44f5840cd7 100644 --- a/jdk/src/share/classes/java/lang/AutoCloseable.java +++ b/jdk/src/share/classes/java/lang/AutoCloseable.java @@ -34,8 +34,8 @@ package java.lang; public interface AutoCloseable { /** * Close this resource, relinquishing any underlying resources. - * This method is invoked automatically by the automatic resource - * management block construct. + * This method is invoked automatically by the {@code + * try}-with-resources statement. * *

Classes implementing this method are strongly encouraged to * be declared to throw more specific exceptions (or no exception diff --git a/jdk/src/share/classes/java/lang/Throwable.java b/jdk/src/share/classes/java/lang/Throwable.java index 4d4169139e8..0073d3f3c3d 100644 --- a/jdk/src/share/classes/java/lang/Throwable.java +++ b/jdk/src/share/classes/java/lang/Throwable.java @@ -498,8 +498,8 @@ public class Throwable implements Serializable { * } * * As of release 7, the platform supports the notion of - * suppressed exceptions (in conjunction with automatic - * resource management blocks). Any exceptions that were + * suppressed exceptions (in conjunction with the {@code + * try}-with-resources statement). Any exceptions that were * suppressed in order to deliver an exception are printed out * beneath the stack trace. The format of this information * depends on the implementation, but the following example may be @@ -805,7 +805,7 @@ public class Throwable implements Serializable { /** * Adds the specified exception to the list of exceptions that - * were suppressed, typically by the automatic resource management + * were suppressed, typically by the {@code try}-with-resources * statement, in order to deliver this exception. * *

Note that when one exception {@linkplain @@ -839,7 +839,7 @@ public class Throwable implements Serializable { /** * Returns an array containing all of the exceptions that were - * suppressed, typically by the automatic resource management + * suppressed, typically by the {@code try}-with-resources * statement, in order to deliver this exception. * * @return an array containing all of the exceptions that were From de9921986c3245d556528bbd8ca1a8d119896215 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Thu, 26 Aug 2010 15:17:17 -0700 Subject: [PATCH 010/128] 6604599: ToolProvider should be less compiler-specific Reviewed-by: darcy --- .../classes/javax/tools/ToolProvider.java | 177 +++++++++++------- .../api/ToolProvider/HelloWorldTest.java | 83 ++++++++ .../api/ToolProvider/ToolProviderTest1.java | 82 ++++++++ .../api/ToolProvider/ToolProviderTest2.java | 87 +++++++++ 4 files changed, 363 insertions(+), 66 deletions(-) create mode 100644 langtools/test/tools/javac/api/ToolProvider/HelloWorldTest.java create mode 100644 langtools/test/tools/javac/api/ToolProvider/ToolProviderTest1.java create mode 100644 langtools/test/tools/javac/api/ToolProvider/ToolProviderTest2.java diff --git a/langtools/src/share/classes/javax/tools/ToolProvider.java b/langtools/src/share/classes/javax/tools/ToolProvider.java index c6be907d87a..e6bd1af26a9 100644 --- a/langtools/src/share/classes/javax/tools/ToolProvider.java +++ b/langtools/src/share/classes/javax/tools/ToolProvider.java @@ -26,10 +26,14 @@ package javax.tools; import java.io.File; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.net.URL; import java.net.URLClassLoader; import java.net.MalformedURLException; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import java.util.logging.Logger; import java.util.logging.Level; import static java.util.logging.Level.*; @@ -44,8 +48,6 @@ import static java.util.logging.Level.*; */ public class ToolProvider { - private ToolProvider() {} - private static final String propertyName = "sun.tools.ToolProvider"; private static final String loggerName = "javax.tools"; @@ -87,6 +89,9 @@ public class ToolProvider { return null; } + private static final String defaultJavaCompilerName + = "com.sun.tools.javac.api.JavacTool"; + /** * Gets the Java™ programming language compiler provided * with this platform. @@ -94,13 +99,7 @@ public class ToolProvider { * {@code null} if no compiler is provided */ public static JavaCompiler getSystemJavaCompiler() { - if (Lazy.compilerClass == null) - return trace(WARNING, "Lazy.compilerClass == null"); - try { - return Lazy.compilerClass.newInstance(); - } catch (Throwable e) { - return trace(WARNING, e); - } + return instance().getSystemTool(JavaCompiler.class, defaultJavaCompilerName); } /** @@ -113,63 +112,109 @@ public class ToolProvider { * or {@code null} if no tools are provided */ public static ClassLoader getSystemToolClassLoader() { - if (Lazy.compilerClass == null) - return trace(WARNING, "Lazy.compilerClass == null"); - return Lazy.compilerClass.getClassLoader(); - } - - /** - * This class will not be initialized until one of the above - * methods are called. This ensures that searching for the - * compiler does not affect platform start up. - */ - static class Lazy { - private static final String defaultJavaCompilerName - = "com.sun.tools.javac.api.JavacTool"; - private static final String[] defaultToolsLocation - = { "lib", "tools.jar" }; - static final Class compilerClass; - static { - Class c = null; - try { - c = findClass().asSubclass(JavaCompiler.class); - } catch (Throwable t) { - trace(WARNING, t); - } - compilerClass = c; - } - - private static Class findClass() - throws MalformedURLException, ClassNotFoundException - { - try { - return enableAsserts(Class.forName(defaultJavaCompilerName, false, null)); - } catch (ClassNotFoundException e) { - trace(FINE, e); - } - File file = new File(System.getProperty("java.home")); - if (file.getName().equalsIgnoreCase("jre")) - file = file.getParentFile(); - for (String name : defaultToolsLocation) - file = new File(file, name); - URL[] urls = {file.toURI().toURL()}; - trace(FINE, urls[0].toString()); - ClassLoader cl = URLClassLoader.newInstance(urls); - cl.setPackageAssertionStatus("com.sun.tools.javac", true); - return Class.forName(defaultJavaCompilerName, false, cl); - } - - private static Class enableAsserts(Class cls) { - try { - ClassLoader loader = cls.getClassLoader(); - if (loader != null) - loader.setPackageAssertionStatus("com.sun.tools.javac", true); - else - trace(FINE, "loader == null"); - } catch (SecurityException ex) { - trace(FINE, ex); - } - return cls; + try { + Class c = + instance().getSystemToolClass(JavaCompiler.class, defaultJavaCompilerName); + return c.getClassLoader(); + } catch (Throwable e) { + return trace(WARNING, e); } } + + + private static ToolProvider instance; + + private static synchronized ToolProvider instance() { + if (instance == null) + instance = new ToolProvider(); + return instance; + } + + // Cache for tool classes. + // Use weak references to avoid keeping classes around unnecessarily + private Map>> toolClasses = new HashMap>>(); + + // Cache for tool classloader. + // Use a weak reference to avoid keeping it around unnecessarily + private Reference refToolClassLoader = null; + + + private ToolProvider() { } + + private T getSystemTool(Class clazz, String name) { + Class c = getSystemToolClass(clazz, name); + try { + return c.asSubclass(clazz).newInstance(); + } catch (Throwable e) { + trace(WARNING, e); + return null; + } + } + + private Class getSystemToolClass(Class clazz, String name) { + Reference> refClass = toolClasses.get(name); + Class c = (refClass == null ? null : refClass.get()); + if (c == null) { + try { + c = findSystemToolClass(name); + } catch (Throwable e) { + return trace(WARNING, e); + } + toolClasses.put(name, new WeakReference>(c)); + } + return c.asSubclass(clazz); + } + + private static final String[] defaultToolsLocation = { "lib", "tools.jar" }; + + private Class findSystemToolClass(String toolClassName) + throws MalformedURLException, ClassNotFoundException + { + // try loading class directly, in case tool is on the bootclasspath + try { + return enableAsserts(Class.forName(toolClassName, false, null)); + } catch (ClassNotFoundException e) { + trace(FINE, e); + + // if tool not on bootclasspath, look in default tools location (tools.jar) + ClassLoader cl = (refToolClassLoader == null ? null : refToolClassLoader.get()); + if (cl == null) { + File file = new File(System.getProperty("java.home")); + if (file.getName().equalsIgnoreCase("jre")) + file = file.getParentFile(); + for (String name : defaultToolsLocation) + file = new File(file, name); + + // if tools not found, no point in trying a URLClassLoader + // so rethrow the original exception. + if (!file.exists()) + throw e; + + URL[] urls = { file.toURI().toURL() }; + trace(FINE, urls[0].toString()); + + cl = URLClassLoader.newInstance(urls); + cl.setPackageAssertionStatus("com.sun.tools.javac", true); + refToolClassLoader = new WeakReference(cl); + } + + return Class.forName(toolClassName, false, cl); + } + + } + + private static Class enableAsserts(Class cls) { + try { + ClassLoader loader = cls.getClassLoader(); + if (loader != null) + loader.setPackageAssertionStatus("com.sun.tools.javac", true); + else + trace(FINE, "loader == null"); + } catch (SecurityException ex) { + trace(FINE, ex); + } + return cls; + } + + } diff --git a/langtools/test/tools/javac/api/ToolProvider/HelloWorldTest.java b/langtools/test/tools/javac/api/ToolProvider/HelloWorldTest.java new file mode 100644 index 00000000000..18002545686 --- /dev/null +++ b/langtools/test/tools/javac/api/ToolProvider/HelloWorldTest.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6604599 + * @summary ToolProvider should be less compiler-specific + */ + +import java.io.*; +import java.util.*; + +// verify that running a simple program, such as this one, does not trigger +// the loading of ToolProvider or any com.sun.tools.javac class +public class HelloWorldTest { + public static void main(String... args) throws Exception { + if (args.length > 0) { + System.err.println(Arrays.asList(args)); + return; + } + + new HelloWorldTest().run(); + } + + void run() throws Exception { + File javaHome = new File(System.getProperty("java.home")); + if (javaHome.getName().equals("jre")) + javaHome = javaHome.getParentFile(); + File javaExe = new File(new File(javaHome, "bin"), "java"); + String classpath = System.getProperty("java.class.path"); + + String[] cmd = { + javaExe.getPath(), + "-verbose:class", + "-classpath", classpath, + HelloWorldTest.class.getName(), + "Hello", "World" + }; + + ProcessBuilder pb = new ProcessBuilder(cmd).redirectErrorStream(true); + Process p = pb.start(); + BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + while ((line = r.readLine()) != null) { + System.err.println(line); + if (line.contains("javax.tools.ToolProvider") || line.contains("com.sun.tools.javac.")) + error(">>> " + line); + } + int rc = p.waitFor(); + if (rc != 0) + error("Unexpected exit code: " + rc); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors; +} diff --git a/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest1.java b/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest1.java new file mode 100644 index 00000000000..aab5474d06f --- /dev/null +++ b/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest1.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6604599 + * @summary ToolProvider should be less compiler-specific + */ + +import java.io.*; + +// verify that running accessing ToolProvider by itself does not +// trigger loading com.sun.tools.javac.* +public class ToolProviderTest1 { + public static void main(String... args) throws Exception { + if (args.length > 0) { + System.err.println(Class.forName(args[0], true, null)); + return; + } + + new ToolProviderTest1().run(); + } + + void run() throws Exception { + File javaHome = new File(System.getProperty("java.home")); + if (javaHome.getName().equals("jre")) + javaHome = javaHome.getParentFile(); + File javaExe = new File(new File(javaHome, "bin"), "java"); + String classpath = System.getProperty("java.class.path"); + + String[] cmd = { + javaExe.getPath(), + "-verbose:class", + "-classpath", classpath, + ToolProviderTest1.class.getName(), + "javax.tools.ToolProvider" + }; + + ProcessBuilder pb = new ProcessBuilder(cmd).redirectErrorStream(true); + Process p = pb.start(); + BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + while ((line = r.readLine()) != null) { + System.err.println(line); + if (line.contains("com.sun.tools.javac.")) + error(">>> " + line); + } + int rc = p.waitFor(); + if (rc != 0) + error("Unexpected exit code: " + rc); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors; +} diff --git a/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest2.java b/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest2.java new file mode 100644 index 00000000000..0a1646fe47c --- /dev/null +++ b/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest2.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6604599 + * @summary ToolProvider should be less compiler-specific + */ + +import java.io.*; +import javax.tools.*; + +// control for ToolProviderTest1 -- verify that using ToolProvider to +// access the compiler does trigger loading com.sun.tools.javac.* +public class ToolProviderTest2 { + public static void main(String... args) throws Exception { + if (args.length > 0) { + System.err.println(ToolProvider.getSystemJavaCompiler()); + return; + } + + new ToolProviderTest2().run(); + } + + void run() throws Exception { + File javaHome = new File(System.getProperty("java.home")); + if (javaHome.getName().equals("jre")) + javaHome = javaHome.getParentFile(); + File javaExe = new File(new File(javaHome, "bin"), "java"); + String classpath = System.getProperty("java.class.path"); + + String[] cmd = { + javaExe.getPath(), + "-verbose:class", + "-classpath", classpath, + ToolProviderTest2.class.getName(), + "javax.tools.ToolProvider" + }; + + ProcessBuilder pb = new ProcessBuilder(cmd).redirectErrorStream(true); + Process p = pb.start(); + BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + boolean found = false; + while ((line = r.readLine()) != null) { + System.err.println(line); + if (line.contains("com.sun.tools.javac.")) + found = true; + } + int rc = p.waitFor(); + if (rc != 0) + error("Unexpected exit code: " + rc); + + if (!found) + System.err.println("expected class name not found"); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors; +} From 98f8b67c3a7eda7e759bf8cfa110539298f0de47 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Thu, 26 Aug 2010 16:13:33 -0700 Subject: [PATCH 011/128] 6980017: javap -XDdetail:source behaves badly if source not available Reviewed-by: ksrini --- .../com/sun/tools/javap/CodeWriter.java | 5 +- .../com/sun/tools/javap/SourceWriter.java | 3 + langtools/test/tools/javap/T6980017.java | 78 +++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 langtools/test/tools/javap/T6980017.java diff --git a/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java b/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java index 2276f3f8226..9861f39ed4d 100644 --- a/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java @@ -239,7 +239,10 @@ class CodeWriter extends BasicWriter { new ArrayList(); if (options.details.contains(InstructionDetailWriter.Kind.SOURCE)) { sourceWriter.reset(classWriter.getClassFile(), attr); - detailWriters.add(sourceWriter); + if (sourceWriter.hasSource()) + detailWriters.add(sourceWriter); + else + println("(Source code not available)"); } if (options.details.contains(InstructionDetailWriter.Kind.LOCAL_VARS)) { diff --git a/langtools/src/share/classes/com/sun/tools/javap/SourceWriter.java b/langtools/src/share/classes/com/sun/tools/javap/SourceWriter.java index 81ef9cb62e0..806c3587c4c 100644 --- a/langtools/src/share/classes/com/sun/tools/javap/SourceWriter.java +++ b/langtools/src/share/classes/com/sun/tools/javap/SourceWriter.java @@ -99,7 +99,10 @@ public class SourceWriter extends InstructionDetailWriter { } } } + } + public boolean hasSource() { + return (sourceLines.length > 0); } private void setLineMap(Code_attribute attr) { diff --git a/langtools/test/tools/javap/T6980017.java b/langtools/test/tools/javap/T6980017.java new file mode 100644 index 00000000000..d5909feede7 --- /dev/null +++ b/langtools/test/tools/javap/T6980017.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6980017 + * @summary javap -XDdetail:source behaves badly if source not available. + */ + +import java.io.*; + +public class T6980017 { + public static void main(String... args) throws Exception { + new T6980017().run(); + } + + void run() throws Exception { + + String[] args = { + "-v", + "-XDdetails:source", + "java.lang.String" + }; + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javap.Main.run(args, pw); + pw.close(); + if (rc != 0) + error("Unexpected exit code: " + rc); + + boolean foundBlankSourceLine = false; + boolean foundNoSourceLine = false; + for (String line: sw.toString().split("[\r\n]+")) { + System.err.println(line); + if (line.contains("Source code not available")) + foundNoSourceLine = true; + if (line.matches("\\s*\\( *[0-9]+\\)\\s*")) + foundBlankSourceLine = true; + } + + if (foundBlankSourceLine) + error("found blank source lines"); + + if (!foundNoSourceLine) + error("did not find \"Source code not available\" message"); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors; +} From 99d83d8d85f957cfc3ce59f8ae631ce19a90da10 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Fri, 27 Aug 2010 17:14:51 -0700 Subject: [PATCH 012/128] 6980724: test/tools/javac/InterfaceAssert.java sometimes fails Reviewed-by: darcy --- langtools/test/tools/javac/InterfaceAssert.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/langtools/test/tools/javac/InterfaceAssert.java b/langtools/test/tools/javac/InterfaceAssert.java index aa8f2a7f8ce..06684757f05 100644 --- a/langtools/test/tools/javac/InterfaceAssert.java +++ b/langtools/test/tools/javac/InterfaceAssert.java @@ -23,9 +23,11 @@ /* * @test - * @bug 4399129 + * @bug 4399129 6980724 * @summary Check that assertions compile properly when nested in an interface * @author gafter + * @compile InterfaceAssert.java + * @run main InterfaceAssert */ /* From fba51e328b461f47d26864ffa58b608f8b012cd0 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Fri, 27 Aug 2010 17:21:17 -0700 Subject: [PATCH 013/128] 6570730: com.sun.source.tree.ModifiersTree.getFlags() should return class type Reviewed-by: mcimadamore --- .../classes/com/sun/source/tree/Tree.java | 17 ++- .../com/sun/tools/javac/tree/JCTree.java | 14 ++- .../test/tools/javac/tree/ClassTreeTest.java | 102 ++++++++++++++++++ .../{T6341023.java => tree/TreeKindTest.java} | 9 +- 4 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 langtools/test/tools/javac/tree/ClassTreeTest.java rename langtools/test/tools/javac/{T6341023.java => tree/TreeKindTest.java} (94%) diff --git a/langtools/src/share/classes/com/sun/source/tree/Tree.java b/langtools/src/share/classes/com/sun/source/tree/Tree.java index 8d5a6dd9a99..7e5ede9bf0a 100644 --- a/langtools/src/share/classes/com/sun/source/tree/Tree.java +++ b/langtools/src/share/classes/com/sun/source/tree/Tree.java @@ -94,7 +94,7 @@ public interface Tree { CATCH(CatchTree.class), /** - * Used for instances of {@link ClassTree}. + * Used for instances of {@link ClassTree} representing classes. */ CLASS(ClassTree.class), @@ -557,6 +557,21 @@ public interface Tree { */ ERRONEOUS(ErroneousTree.class), + /** + * Used for instances of {@link ClassTree} representing interfaces. + */ + INTERFACE(ClassTree.class), + + /** + * Used for instances of {@link ClassTree} representing enums. + */ + ENUM(ClassTree.class), + + /** + * Used for instances of {@link ClassTree} representing annotation types. + */ + ANNOTATION_TYPE(ClassTree.class), + /** * An implementation-reserved node. This is the not the node * you are looking for. diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java index 64a991b03f7..209544d3cf1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java @@ -340,6 +340,7 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { public abstract int getTag(); /** Convert a tree to a pretty-printed string. */ + @Override public String toString() { StringWriter s = new StringWriter(); try { @@ -375,6 +376,7 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** Return a shallow copy of this tree. */ + @Override public Object clone() { try { return super.clone(); @@ -587,7 +589,17 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { @Override public void accept(Visitor v) { v.visitClassDef(this); } - public Kind getKind() { return Kind.CLASS; } + public Kind getKind() { + if ((mods.flags & Flags.ANNOTATION) != 0) + return Kind.ANNOTATION_TYPE; + else if ((mods.flags & Flags.INTERFACE) != 0) + return Kind.INTERFACE; + else if ((mods.flags & Flags.ENUM) != 0) + return Kind.ENUM; + else + return Kind.CLASS; + } + public JCModifiers getModifiers() { return mods; } public Name getSimpleName() { return name; } public List getTypeParameters() { diff --git a/langtools/test/tools/javac/tree/ClassTreeTest.java b/langtools/test/tools/javac/tree/ClassTreeTest.java new file mode 100644 index 00000000000..f1cec3b438b --- /dev/null +++ b/langtools/test/tools/javac/tree/ClassTreeTest.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6570730 + * @summary com.sun.source.tree.ModifiersTree.getFlags() should return class type + */ + +import java.io.*; +import java.util.*; +import javax.tools.*; +import com.sun.source.tree.*; +import com.sun.source.util.*; +import com.sun.tools.javac.api.*; + +public class ClassTreeTest { + public static void main(String... args) throws Exception { + new ClassTreeTest().run(); + } + + void run() throws Exception { + JavacTool tool = JavacTool.create(); + StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); + List opts = Collections.emptyList(); + File testSrc = new File(System.getProperty("test.src")); + File thisFile = new File(testSrc, ClassTreeTest.class.getSimpleName() + ".java"); + Iterable fos = fm.getJavaFileObjects(thisFile); + JavacTask task = tool.getTask(null, fm, null, opts, null, fos); + for (CompilationUnitTree cu: task.parse()) { + check(cu, "CLASS", Tree.Kind.CLASS); + check(cu, "INTERFACE", Tree.Kind.INTERFACE); + check(cu, "ENUM", Tree.Kind.ENUM); + check(cu, "ANNOTATION_TYPE", Tree.Kind.ANNOTATION_TYPE); + } + + int expected = 4; + if (checks != expected) + error("Unexpected number of checks performed; expected: " + expected + ", found: " + checks); + + if (errors > 0) + throw new Exception(errors + " errors found"); + } + + void check(CompilationUnitTree cu, String name, Tree.Kind k) { + checks++; + + TreeScanner s = new TreeScanner() { + @Override + public ClassTree visitClass(ClassTree c, String name) { + if (c.getSimpleName().toString().equals(name)) + return c; + else + return super.visitClass(c, name); + } + + @Override + public ClassTree reduce(ClassTree t1, ClassTree t2) { + return (t1 != null ? t1 : t2); + } + }; + + ClassTree c = s.scan(cu, name); + if (c == null) + error("Can't find node named " + name); + else if (c.getKind() != k) + error("Unexpected kind for node named " + name + ": expected: " + k + ", found: " + c.getKind()); + } + + void error(String msg) { + System.err.println("Error: " + msg); + errors++; + } + + int checks; + int errors; + + class CLASS { } + interface INTERFACE { } + enum ENUM { } + @interface ANNOTATION_TYPE { } +} diff --git a/langtools/test/tools/javac/T6341023.java b/langtools/test/tools/javac/tree/TreeKindTest.java similarity index 94% rename from langtools/test/tools/javac/T6341023.java rename to langtools/test/tools/javac/tree/TreeKindTest.java index edda9504a24..c726eb7b1cd 100644 --- a/langtools/test/tools/javac/T6341023.java +++ b/langtools/test/tools/javac/tree/TreeKindTest.java @@ -29,7 +29,7 @@ import com.sun.source.tree.*; -public class T6341023 { +public class TreeKindTest{ public static void main(String... args) { boolean ok = true; @@ -101,6 +101,13 @@ public class T6341023 { ok = ok & verify(k, i, i == WildcardTree.class); break; + case INTERFACE: + case ANNOTATION_TYPE: + case ENUM: + case CLASS: + ok = ok & verify(k, i, i == ClassTree.class); + break; + case OTHER: ok = ok & verify(k, i, i == null); break; From e96eb944c29b6fd6b1fbda3f3e0d1f139fed6290 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Fri, 27 Aug 2010 17:59:08 -0700 Subject: [PATCH 014/128] 6980707: Reduce use of IOException in JavaCompiler Reviewed-by: darcy --- .../sun/tools/javac/main/JavaCompiler.java | 14 ++++----- .../com/sun/tools/javac/main/Main.java | 5 +++- .../JavacProcessingEnvironment.java | 30 ++++++++++++------- .../tools/javac/resources/compiler.properties | 2 ++ .../com/sun/tools/javac/util/FatalError.java | 15 ++++++---- .../tools/javac/diags/examples.not-yet.txt | 1 + 6 files changed, 41 insertions(+), 26 deletions(-) diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java index 70ba262411b..c3768fe05f5 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -608,7 +608,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { * @param filename The name of the file to be parsed. */ @Deprecated - public JCTree.JCCompilationUnit parse(String filename) throws IOException { + public JCTree.JCCompilationUnit parse(String filename) { JavacFileManager fm = (JavacFileManager)fileManager; return parse(fm.getJavaFileObjectsFromStrings(List.of(filename)).iterator().next()); } @@ -778,7 +778,6 @@ public class JavaCompiler implements ClassReader.SourceCompleter { public void compile(List sourceFileObjects, List classnames, Iterable processors) - throws IOException // TODO: temp, from JavacProcessingEnvironment { if (processors != null && processors.iterator().hasNext()) explicitAnnotationProcessingRequested = true; @@ -868,7 +867,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { /** * Parses a list of files. */ - public List parseFiles(Iterable fileObjects) throws IOException { + public List parseFiles(Iterable fileObjects) { if (shouldStop(CompileState.PARSE)) return List.nil(); @@ -950,8 +949,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { * @param processors user provided annotation processors to bypass * discovery, {@code null} means that no processors were provided */ - public void initProcessAnnotations(Iterable processors) - throws IOException { + public void initProcessAnnotations(Iterable processors) { // Process annotations if processing is not disabled and there // is at least one Processor available. Options options = Options.instance(context); @@ -978,8 +976,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { } // TODO: called by JavacTaskImpl - public JavaCompiler processAnnotations(List roots) - throws IOException { + public JavaCompiler processAnnotations(List roots) { return processAnnotations(roots, List.nil()); } @@ -989,8 +986,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { * @return an instance of the compiler in which to complete the compilation */ public JavaCompiler processAnnotations(List roots, - List classnames) - throws IOException { // TODO: see TEMP note in JavacProcessingEnvironment + List classnames) { if (shouldStop(CompileState.PROCESS)) { // Errors were encountered. // If log.unrecoverableError is set, the errors were parse errors diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java index 4a9e6aef368..15fe14e1a6b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java @@ -467,10 +467,13 @@ public class Main { ex.printStackTrace(out); } - /** Print a message reporting an fatal error. + /** Print a message reporting a fatal error. */ void feMessage(Throwable ex) { Log.printLines(out, ex.getMessage()); + if (ex.getCause() != null && options.get("dev") != null) { + ex.getCause().printStackTrace(out); + } } /** Print a message reporting an input/output error. diff --git a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java index c8667b66a92..e4318f513cf 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java @@ -67,6 +67,8 @@ import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.Abort; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Convert; +import com.sun.tools.javac.util.FatalError; +import com.sun.tools.javac.util.JCDiagnostic; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.JavacMessages; @@ -131,6 +133,10 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea */ Log log; + /** Diagnostic factory. + */ + JCDiagnostic.Factory diags; + /** * Source level of the compile. */ @@ -146,10 +152,11 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea private Context context; public JavacProcessingEnvironment(Context context, Iterable processors) { - options = Options.instance(context); this.context = context; log = Log.instance(context); source = Source.instance(context); + diags = JCDiagnostic.Factory.instance(context); + options = Options.instance(context); printProcessorInfo = options.get("-XprintProcessorInfo") != null; printRounds = options.get("-XprintRounds") != null; verbose = options.get("-verbose") != null; @@ -848,8 +855,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea /** Create a new round. */ private Round(Round prev, - Set newSourceFiles, Map newClassFiles) - throws IOException { + Set newSourceFiles, Map newClassFiles) { this(prev.nextContext(), prev.number+1, prev.compiler.log.nwarnings); this.genClassFiles = prev.genClassFiles; @@ -882,8 +888,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } /** Create the next round to be used. */ - Round next(Set newSourceFiles, Map newClassFiles) - throws IOException { + Round next(Set newSourceFiles, Map newClassFiles) { try { return new Round(this, newSourceFiles, newClassFiles); } finally { @@ -1083,8 +1088,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea public JavaCompiler doProcessing(Context context, List roots, List classSymbols, - Iterable pckSymbols) - throws IOException { + Iterable pckSymbols) { TaskListener taskListener = context.get(TaskListener.class); log = Log.instance(context); @@ -1184,13 +1188,19 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea /** * Free resources related to annotation processing. */ - public void close() throws IOException { + public void close() { filer.close(); if (discoveredProcs != null) // Make calling close idempotent discoveredProcs.close(); discoveredProcs = null; - if (processorClassLoader != null && processorClassLoader instanceof Closeable) - ((Closeable) processorClassLoader).close(); + if (processorClassLoader != null && processorClassLoader instanceof Closeable) { + try { + ((Closeable) processorClassLoader).close(); + } catch (IOException e) { + JCDiagnostic msg = diags.fragment("fatal.err.cant.close.loader"); + throw new FatalError(msg, e); + } + } } private List getTopLevelClasses(List units) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties index aa5c03cd038..742b210576e 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -550,6 +550,8 @@ compiler.misc.fatal.err.cant.locate.field=\ Fatal Error: Unable to find field {0} compiler.misc.fatal.err.cant.locate.ctor=\ Fatal Error: Unable to find constructor for {0} +compiler.misc.fatal.err.cant.close.loader=\ + Fatal Error: Cannot close class loader for annotation processors ##### diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/FatalError.java b/langtools/src/share/classes/com/sun/tools/javac/util/FatalError.java index 16bdd21a9d6..51d6bbc2898 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/FatalError.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/FatalError.java @@ -37,12 +37,6 @@ package com.sun.tools.javac.util; public class FatalError extends Error { private static final long serialVersionUID = 0; - /** Construct a FatalError with no detail message. - */ - public FatalError() { - super(); - } - /** Construct a FatalError with the specified detail message. * @param d A diagnostic containing the reason for failure. */ @@ -50,6 +44,15 @@ public class FatalError extends Error { super(d.toString()); } + /** Construct a FatalError with the specified detail message + * and cause. + * @param d A diagnostic containing the reason for failure. + * @param t An exception causing the error + */ + public FatalError(JCDiagnostic d, Throwable t) { + super(d.toString(), t); + } + /** Construct a FatalError with the specified detail message. * @param s An English(!) string describing the failure, typically because * the diagnostic resources are missing. diff --git a/langtools/test/tools/javac/diags/examples.not-yet.txt b/langtools/test/tools/javac/diags/examples.not-yet.txt index 5b83aa058c7..7bcc4fa0e2f 100644 --- a/langtools/test/tools/javac/diags/examples.not-yet.txt +++ b/langtools/test/tools/javac/diags/examples.not-yet.txt @@ -62,6 +62,7 @@ compiler.misc.class.file.wrong.class compiler.misc.fatal.err.cant.locate.ctor # Resolve, from Lower compiler.misc.fatal.err.cant.locate.field # Resolve, from Lower compiler.misc.fatal.err.cant.locate.meth # Resolve, from Lower +compiler.misc.fatal.err.cant.close.loader # JavacProcessingEnvironment compiler.misc.file.does.not.contain.package compiler.misc.illegal.start.of.class.file compiler.misc.inferred.do.not.conform.to.params # UNUSED (hard to see if very complex inference scenario might require this though, so leaving it in, as per JLS3) From aff3ad21b8463e4446647f3df92c279686ac40a2 Mon Sep 17 00:00:00 2001 From: Martin Buchholz Date: Sat, 28 Aug 2010 12:15:52 -0700 Subject: [PATCH 015/128] 6980747: Runtime.exec can fail due to SecurityException (lnx) Add missing doPrivileged to UNIXProcess.java.linux Reviewed-by: alanb --- .../classes/java/lang/UNIXProcess.java.linux | 27 ++++--- .../ProcessBuilder/SecurityManagerClinit.java | 79 +++++++++++++++++++ 2 files changed, 94 insertions(+), 12 deletions(-) create mode 100644 jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java diff --git a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux index af68ce18e6b..29477f93bbc 100644 --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux +++ b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux @@ -39,6 +39,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Executor; import java.util.concurrent.ThreadFactory; import java.security.AccessController; +import static java.security.AccessController.doPrivileged; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; @@ -94,14 +95,13 @@ final class UNIXProcess extends Process { private final static ThreadGroup group = getRootThreadGroup(); private static ThreadGroup getRootThreadGroup() { - return AccessController.doPrivileged - (new PrivilegedAction () { - public ThreadGroup run() { - ThreadGroup root = Thread.currentThread().getThreadGroup(); - while (root.getParent() != null) - root = root.getParent(); - return root; - }}); + return doPrivileged(new PrivilegedAction () { + public ThreadGroup run() { + ThreadGroup root = Thread.currentThread().getThreadGroup(); + while (root.getParent() != null) + root = root.getParent(); + return root; + }}); } public Thread newThread(Runnable grimReaper) { @@ -117,8 +117,12 @@ final class UNIXProcess extends Process { /** * The thread pool of "process reaper" daemon threads. */ - private static final Executor processReaperExecutor - = Executors.newCachedThreadPool(new ProcessReaperThreadFactory()); + private static final Executor processReaperExecutor = + doPrivileged(new PrivilegedAction() { + public Executor run() { + return Executors.newCachedThreadPool + (new ProcessReaperThreadFactory()); + }}); UNIXProcess(final byte[] prog, final byte[] argBlock, final int argc, @@ -136,8 +140,7 @@ final class UNIXProcess extends Process { redirectErrorStream); try { - AccessController.doPrivileged - (new PrivilegedExceptionAction() { + doPrivileged(new PrivilegedExceptionAction() { public Void run() throws IOException { initStreams(fds); return null; diff --git a/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java b/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java new file mode 100644 index 00000000000..dff61742225 --- /dev/null +++ b/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java @@ -0,0 +1,79 @@ +/* + * Copyright 2010 Google Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6980747 + * @summary Check that Process-related classes have the proper + * doPrivileged blocks, and can be initialized with an adversarial + * security manager. + * @run main/othervm SecurityManagerClinit + * @author Martin Buchholz + */ + +import java.io.*; +import java.security.*; + +public class SecurityManagerClinit { + private static class Policy extends java.security.Policy { + private Permissions perms; + + public Policy(Permission... permissions) { + perms = new Permissions(); + for (Permission permission : permissions) + perms.add(permission); + } + + public boolean implies(ProtectionDomain pd, Permission p) { + return perms.implies(p); + } + } + + public static void main(String[] args) throws Throwable { + String javaExe = + System.getProperty("java.home") + + File.separator + "bin" + File.separator + "java"; + + // A funky contrived security setup, just for bug repro purposes. + java.security.Security.setProperty("package.access", "java.util"); + + final Policy policy = + new Policy + (new FilePermission("<>", "execute"), + new RuntimePermission("setSecurityManager")); + Policy.setPolicy(policy); + + System.setSecurityManager(new SecurityManager()); + + try { + String[] cmd = { javaExe, "-version" }; + Process p = Runtime.getRuntime().exec(cmd); + p.getOutputStream().close(); + p.getInputStream().close(); + p.getErrorStream().close(); + p.waitFor(); + } finally { + System.setSecurityManager(null); + } + } +} From 7fe5113fe77b2ae53768238ab4dfba752f96c30d Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Mon, 30 Aug 2010 14:37:43 +0800 Subject: [PATCH 016/128] 6911951: NTLM should be a supported Java SASL mechanism Reviewed-by: vinnie, michaelm --- .../classes/com/sun/security/ntlm/Client.java | 212 +++++++++ .../classes/com/sun/security/ntlm/NTLM.java | 426 ++++++++++++++++++ .../com/sun/security/ntlm/NTLMException.java | 88 ++++ .../classes/com/sun/security/ntlm/Server.java | 205 +++++++++ .../com/sun/security/ntlm/Version.java | 30 ++ .../com/sun/security/sasl/Provider.java | 12 +- .../sun/security/sasl/ntlm/FactoryImpl.java | 119 +++++ .../sun/security/sasl/ntlm/NTLMClient.java | 231 ++++++++++ .../sun/security/sasl/ntlm/NTLMServer.java | 226 ++++++++++ .../http/ntlm/NTLMAuthentication.java | 252 ++--------- .../com/sun/security/sasl/ntlm/NTLMTest.java | 416 +++++++++++++++++ 11 files changed, 1999 insertions(+), 218 deletions(-) create mode 100644 jdk/src/share/classes/com/sun/security/ntlm/Client.java create mode 100644 jdk/src/share/classes/com/sun/security/ntlm/NTLM.java create mode 100644 jdk/src/share/classes/com/sun/security/ntlm/NTLMException.java create mode 100644 jdk/src/share/classes/com/sun/security/ntlm/Server.java create mode 100644 jdk/src/share/classes/com/sun/security/ntlm/Version.java create mode 100644 jdk/src/share/classes/com/sun/security/sasl/ntlm/FactoryImpl.java create mode 100644 jdk/src/share/classes/com/sun/security/sasl/ntlm/NTLMClient.java create mode 100644 jdk/src/share/classes/com/sun/security/sasl/ntlm/NTLMServer.java create mode 100644 jdk/test/com/sun/security/sasl/ntlm/NTLMTest.java diff --git a/jdk/src/share/classes/com/sun/security/ntlm/Client.java b/jdk/src/share/classes/com/sun/security/ntlm/Client.java new file mode 100644 index 00000000000..aed8f37084d --- /dev/null +++ b/jdk/src/share/classes/com/sun/security/ntlm/Client.java @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.security.ntlm; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Date; +import java.util.Locale; + +/** + * The NTLM client. Not multi-thread enabled.

+ * Example: + *

+ * Client client = new Client(null, "host", "dummy",
+ *       "REALM", "t0pSeCr3t".toCharArray());
+ * byte[] type1 = client.type1();
+ * // Send type1 to server and receive response as type2
+ * byte[] type3 = client.type3(type2, nonce);
+ * // Send type3 to server
+ * 
+ */ +public final class Client extends NTLM { + final private String hostname; + final private String username; + + private String domain; // might be updated by Type 2 msg + private byte[] pw1, pw2; + + /** + * Creates an NTLM Client instance. + * @param version the NTLM version to use, which can be: + *
    + *
  • LM/NTLM: Original NTLM v1 + *
  • LM: Original NTLM v1, LM only + *
  • NTLM: Original NTLM v1, NTLM only + *
  • NTLM2: NTLM v1 with Client Challenge + *
  • LMv2/NTLMv2: NTLM v2 + *
  • LMv2: NTLM v2, LM only + *
  • NTLMv2: NTLM v2, NTLM only + *
+ * If null, "LMv2/NTLMv2" will be used. + * @param hostname hostname of the client, can be null + * @param username username to be authenticated, must not be null + * @param domain domain of {@code username}, can be null + * @param password password for {@code username}, must not be not null. + * This method does not make any modification to this parameter, it neither + * needs to access the content of this parameter after this method call, + * so you are free to modify or nullify this parameter after this call. + * @throws NullPointerException if {@code username} or {@code password} is null. + * @throws NTLMException if {@code version} is illegal + */ + public Client(String version, String hostname, String username, + String domain, char[] password) throws NTLMException { + super(version); + if ((username == null || password == null)) { + throw new NullPointerException("username/password cannot be null"); + } + this.hostname = hostname; + this.username = username; + this.domain = domain; + this.pw1 = getP1(password); + this.pw2 = getP2(password); + debug("NTLM Client: (h,u,t,version(v)) = (%s,%s,%s,%s(%s))\n", + hostname, username, domain, version, v.toString()); + } + + /** + * Generates the Type 1 message + * @return the message generated + */ + public byte[] type1() { + Writer p = new Writer(1, 32); + int flags = 0x8203; + if (hostname != null) { + flags |= 0x2000; + } + if (domain != null) { + flags |= 0x1000; + } + if (v != Version.NTLM) { + flags |= 0x80000; + } + p.writeInt(12, flags); + p.writeSecurityBuffer(24, hostname, false); + p.writeSecurityBuffer(16, domain, false); + debug("NTLM Client: Type 1 created\n"); + debug(p.getBytes()); + return p.getBytes(); + } + + /** + * Generates the Type 3 message + * @param type2 the responding Type 2 message from server, must not be null + * @param nonce random 8-byte array to be used in message generation, + * must not be null except for original NTLM v1 + * @return the message generated + * @throws NullPointerException if {@code type2} or {@code nonce} is null + * for NTLM v1. + * @throws NTLMException if the incoming message is invalid + */ + public byte[] type3(byte[] type2, byte[] nonce) throws NTLMException { + if (type2 == null || (v != Version.NTLM && nonce == null)) { + throw new NullPointerException("type2 and nonce cannot be null"); + } + debug("NTLM Client: Type 2 received\n"); + debug(type2); + Reader r = new Reader(type2); + byte[] challenge = r.readBytes(24, 8); + int inputFlags = r.readInt(20); + boolean unicode = (inputFlags & 1) == 1; + String domainFromServer = r.readSecurityBuffer(12, unicode); + if (domainFromServer != null) { + domain = domainFromServer; + } + if (domain == null) { + throw new NTLMException(NTLMException.NO_DOMAIN_INFO, + "No domain info"); + } + + int flags = 0x88200 | (inputFlags & 3); + Writer p = new Writer(3, 64); + byte[] lm = null, ntlm = null; + + p.writeSecurityBuffer(28, domain, unicode); + p.writeSecurityBuffer(36, username, unicode); + p.writeSecurityBuffer(44, hostname, unicode); + + if (v == Version.NTLM) { + byte[] lmhash = calcLMHash(pw1); + byte[] nthash = calcNTHash(pw2); + if (writeLM) lm = calcResponse (lmhash, challenge); + if (writeNTLM) ntlm = calcResponse (nthash, challenge); + } else if (v == Version.NTLM2) { + byte[] nthash = calcNTHash(pw2); + lm = ntlm2LM(nonce); + ntlm = ntlm2NTLM(nthash, nonce, challenge); + } else { + byte[] nthash = calcNTHash(pw2); + if (writeLM) lm = calcV2(nthash, + username.toUpperCase(Locale.US)+domain, nonce, challenge); + if (writeNTLM) { + byte[] alist = type2.length > 48 ? + r.readSecurityBuffer(40) : new byte[0]; + byte[] blob = new byte[32+alist.length]; + System.arraycopy(new byte[]{1,1,0,0,0,0,0,0}, 0, blob, 0, 8); + // TS + byte[] time = BigInteger.valueOf(new Date().getTime()) + .add(new BigInteger("11644473600000")) + .multiply(BigInteger.valueOf(10000)) + .toByteArray(); + for (int i=0; iSystem.out.printf(format, args) is + * called. This method is designed to be overridden by child classes to + * match their own debugging/logging mechanisms. + * @param format a format string + * @param args the arguments referenced by format + * @see java.io.PrintStream#printf(java.lang.String, java.lang.Object[]) + */ + public void debug(String format, Object... args) { + if (DEBUG) { + System.out.printf(format, args); + } + } + + /** + * Prints out the content of a byte array, called in various places inside + * the NTLM implementation for debugging/logging purposes. When the system + * property "ntlm.debug" is set, the hexdump of the array is printed into + * System.out. This method is designed to be overridden by child classes to + * match their own debugging/logging mechanisms. + * @param bytes the byte array to print out + */ + public void debug(byte[] bytes) { + if (DEBUG) { + try { + new sun.misc.HexDumpEncoder().encodeBuffer(bytes, System.out); + } catch (IOException ioe) { + // Impossible + } + } + } + + /** + * Reading an NTLM packet + */ + static class Reader { + + private final byte[] internal; + + Reader(byte[] data) { + internal = data; + } + + int readInt(int offset) throws NTLMException { + try { + return internal[offset] & 0xff + + (internal[offset+1] & 0xff << 8) + + (internal[offset+2] & 0xff << 16) + + (internal[offset+3] & 0xff << 24); + } catch (ArrayIndexOutOfBoundsException ex) { + throw new NTLMException(NTLMException.PACKET_READ_ERROR, + "Input message incorrect size"); + } + } + + int readShort(int offset) throws NTLMException { + try { + return internal[offset] & 0xff + + (internal[offset+1] & 0xff << 8); + } catch (ArrayIndexOutOfBoundsException ex) { + throw new NTLMException(NTLMException.PACKET_READ_ERROR, + "Input message incorrect size"); + } + } + + byte[] readBytes(int offset, int len) throws NTLMException { + try { + return Arrays.copyOfRange(internal, offset, offset + len); + } catch (ArrayIndexOutOfBoundsException ex) { + throw new NTLMException(NTLMException.PACKET_READ_ERROR, + "Input message incorrect size"); + } + } + + byte[] readSecurityBuffer(int offset) throws NTLMException { + int pos = readInt(offset+4); + if (pos == 0) return null; + try { + return Arrays.copyOfRange( + internal, pos, pos + readShort(offset)); + } catch (ArrayIndexOutOfBoundsException ex) { + throw new NTLMException(NTLMException.PACKET_READ_ERROR, + "Input message incorrect size"); + } + } + + String readSecurityBuffer(int offset, boolean unicode) + throws NTLMException { + byte[] raw = readSecurityBuffer(offset); + try { + return raw == null ? null : new String( + raw, unicode ? "UnicodeLittleUnmarked" : "ISO8859_1"); + } catch (UnsupportedEncodingException ex) { + throw new NTLMException(NTLMException.PACKET_READ_ERROR, + "Invalid input encoding"); + } + } + } + + /** + * Writing an NTLM packet + */ + static class Writer { + + private byte[] internal; // buffer + private int current; // current written content interface buffer + + /** + * Starts writing a NTLM packet + * @param type NEGOTIATE || CHALLENGE || AUTHENTICATE + * @param len the base length, without security buffers + */ + Writer(int type, int len) { + assert len < 256; + internal = new byte[256]; + current = len; + System.arraycopy ( + new byte[] {'N','T','L','M','S','S','P',0,(byte)type}, + 0, internal, 0, 9); + } + + void writeShort(int offset, int number) { + internal[offset] = (byte)(number); + internal[offset+1] = (byte)(number >> 8); + } + + void writeInt(int offset, int number) { + internal[offset] = (byte)(number); + internal[offset+1] = (byte)(number >> 8); + internal[offset+2] = (byte)(number >> 16); + internal[offset+3] = (byte)(number >> 24); + } + + void writeBytes(int offset, byte[] data) { + System.arraycopy(data, 0, internal, offset, data.length); + } + + void writeSecurityBuffer(int offset, byte[] data) { + if (data == null) { + writeShort(offset+4, current); + } else { + int len = data.length; + if (current + len > internal.length) { + internal = Arrays.copyOf(internal, current + len + 256); + } + writeShort(offset, len); + writeShort(offset+2, len); + writeShort(offset+4, current); + System.arraycopy(data, 0, internal, current, len); + current += len; + } + } + + void writeSecurityBuffer(int offset, String str, boolean unicode) { + try { + writeSecurityBuffer(offset, str == null ? null : str.getBytes( + unicode ? "UnicodeLittleUnmarked" : "ISO8859_1")); + } catch (UnsupportedEncodingException ex) { + assert false; + } + } + + byte[] getBytes() { + return Arrays.copyOf(internal, current); + } + } + + // LM/NTLM + + /* Convert a 7 byte array to an 8 byte array (for a des key with parity) + * input starts at offset off + */ + byte[] makeDesKey (byte[] input, int off) { + int[] in = new int [input.length]; + for (int i=0; i> 1)); + out[2] = (byte)(((in[off+1] << 6) & 0xFF) | (in[off+2] >> 2)); + out[3] = (byte)(((in[off+2] << 5) & 0xFF) | (in[off+3] >> 3)); + out[4] = (byte)(((in[off+3] << 4) & 0xFF) | (in[off+4] >> 4)); + out[5] = (byte)(((in[off+4] << 3) & 0xFF) | (in[off+5] >> 5)); + out[6] = (byte)(((in[off+5] << 2) & 0xFF) | (in[off+6] >> 6)); + out[7] = (byte)((in[off+6] << 1) & 0xFF); + return out; + } + + byte[] calcLMHash (byte[] pwb) { + byte[] magic = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25}; + byte[] pwb1 = new byte [14]; + int len = pwb.length; + if (len > 14) + len = 14; + System.arraycopy (pwb, 0, pwb1, 0, len); /* Zero padded */ + + try { + DESKeySpec dks1 = new DESKeySpec (makeDesKey (pwb1, 0)); + DESKeySpec dks2 = new DESKeySpec (makeDesKey (pwb1, 7)); + + SecretKey key1 = fac.generateSecret (dks1); + SecretKey key2 = fac.generateSecret (dks2); + cipher.init (Cipher.ENCRYPT_MODE, key1); + byte[] out1 = cipher.doFinal (magic, 0, 8); + cipher.init (Cipher.ENCRYPT_MODE, key2); + byte[] out2 = cipher.doFinal (magic, 0, 8); + byte[] result = new byte [21]; + System.arraycopy (out1, 0, result, 0, 8); + System.arraycopy (out2, 0, result, 8, 8); + return result; + } catch (InvalidKeyException ive) { + // Will not happen, all key material are 8 bytes + assert false; + } catch (InvalidKeySpecException ikse) { + // Will not happen, we only feed DESKeySpec to DES factory + assert false; + } catch (IllegalBlockSizeException ibse) { + // Will not happen, we encrypt 8 bytes + assert false; + } catch (BadPaddingException bpe) { + // Will not happen, this is encryption + assert false; + } + return null; // will not happen, we returned already + } + + byte[] calcNTHash (byte[] pw) { + byte[] out = md4.digest (pw); + byte[] result = new byte [21]; + System.arraycopy (out, 0, result, 0, 16); + return result; + } + + /* key is a 21 byte array. Split it into 3 7 byte chunks, + * Convert each to 8 byte DES keys, encrypt the text arg with + * each key and return the three results in a sequential [] + */ + byte[] calcResponse (byte[] key, byte[] text) { + try { + assert key.length == 21; + DESKeySpec dks1 = new DESKeySpec(makeDesKey(key, 0)); + DESKeySpec dks2 = new DESKeySpec(makeDesKey(key, 7)); + DESKeySpec dks3 = new DESKeySpec(makeDesKey(key, 14)); + SecretKey key1 = fac.generateSecret(dks1); + SecretKey key2 = fac.generateSecret(dks2); + SecretKey key3 = fac.generateSecret(dks3); + cipher.init(Cipher.ENCRYPT_MODE, key1); + byte[] out1 = cipher.doFinal(text, 0, 8); + cipher.init(Cipher.ENCRYPT_MODE, key2); + byte[] out2 = cipher.doFinal(text, 0, 8); + cipher.init(Cipher.ENCRYPT_MODE, key3); + byte[] out3 = cipher.doFinal(text, 0, 8); + byte[] result = new byte[24]; + System.arraycopy(out1, 0, result, 0, 8); + System.arraycopy(out2, 0, result, 8, 8); + System.arraycopy(out3, 0, result, 16, 8); + return result; + } catch (IllegalBlockSizeException ex) { // None will happen + assert false; + } catch (BadPaddingException ex) { + assert false; + } catch (InvalidKeySpecException ex) { + assert false; + } catch (InvalidKeyException ex) { + assert false; + } + return null; + } + + // LMv2/NTLMv2 + + byte[] hmacMD5(byte[] key, byte[] text) { + try { + SecretKeySpec skey = + new SecretKeySpec(Arrays.copyOf(key, 16), "HmacMD5"); + hmac.init(skey); + return hmac.doFinal(text); + } catch (InvalidKeyException ex) { + assert false; + } catch (RuntimeException e) { + assert false; + } + return null; + } + + byte[] calcV2(byte[] nthash, String text, byte[] blob, byte[] challenge) { + try { + byte[] ntlmv2hash = hmacMD5(nthash, + text.getBytes("UnicodeLittleUnmarked")); + byte[] cn = new byte[blob.length+8]; + System.arraycopy(challenge, 0, cn, 0, 8); + System.arraycopy(blob, 0, cn, 8, blob.length); + byte[] result = new byte[16+blob.length]; + System.arraycopy(hmacMD5(ntlmv2hash, cn), 0, result, 0, 16); + System.arraycopy(blob, 0, result, 16, blob.length); + return result; + } catch (UnsupportedEncodingException ex) { + assert false; + } + return null; + } + + // NTLM2 LM/NTLM + + static byte[] ntlm2LM(byte[] nonce) { + return Arrays.copyOf(nonce, 24); + } + + byte[] ntlm2NTLM(byte[] ntlmHash, byte[] nonce, byte[] challenge) { + byte[] b = Arrays.copyOf(challenge, 16); + System.arraycopy(nonce, 0, b, 8, 8); + byte[] sesshash = Arrays.copyOf(md5.digest(b), 8); + return calcResponse(ntlmHash, sesshash); + } + + // Password in ASCII and UNICODE + + static byte[] getP1(char[] password) { + try { + return new String(password).toUpperCase().getBytes("ISO8859_1"); + } catch (UnsupportedEncodingException ex) { + return null; + } + } + + static byte[] getP2(char[] password) { + try { + return new String(password).getBytes("UnicodeLittleUnmarked"); + } catch (UnsupportedEncodingException ex) { + return null; + } + } +} diff --git a/jdk/src/share/classes/com/sun/security/ntlm/NTLMException.java b/jdk/src/share/classes/com/sun/security/ntlm/NTLMException.java new file mode 100644 index 00000000000..273825de8b7 --- /dev/null +++ b/jdk/src/share/classes/com/sun/security/ntlm/NTLMException.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.security.ntlm; + +import java.security.GeneralSecurityException; + +/** + * An NTLM-related Exception + */ +public final class NTLMException extends GeneralSecurityException { + + /** + * If the incoming packet is invalid. + */ + public final static int PACKET_READ_ERROR = 1; + + /** + * If the client cannot get a domain value from the server and the + * caller has not provided one. + */ + public final static int NO_DOMAIN_INFO = 2; + + /** + * If the domain provided by the client does not match the one received + * from server. + */ + //public final static int DOMAIN_UNMATCH = 3; + + /** + * If the client name is not found on server's user database. + */ + public final static int USER_UNKNOWN = 3; + + /** + * If authentication fails. + */ + public final static int AUTH_FAILED = 4; + + /** + * If an illegal version string is provided. + */ + public final static int BAD_VERSION = 5; + + private int errorCode; + + /** + * Constructs an NTLMException object. + * @param errorCode the error code, which can be retrieved by + * the {@link #errorCode() } method. + * @param msg the string message, which can be retrived by + * the {@link Exception#getMessage() } method. + */ + public NTLMException(int errorCode, String msg) { + super(msg); + this.errorCode = errorCode; + } + + /** + * Returns the error code associated with this NTLMException. + * @return the error code + */ + public int errorCode() { + return errorCode; + } +} diff --git a/jdk/src/share/classes/com/sun/security/ntlm/Server.java b/jdk/src/share/classes/com/sun/security/ntlm/Server.java new file mode 100644 index 00000000000..1871375a4b7 --- /dev/null +++ b/jdk/src/share/classes/com/sun/security/ntlm/Server.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.security.ntlm; + +import java.util.Arrays; +import java.util.Locale; + +/** + * The NTLM server, not multi-thread enabled.

+ * Example: + *

+ * Server server = new Server(null, "REALM") {
+ *     public char[] getPassword(String ntdomain, String username) {
+ *         switch (username) {
+ *             case "dummy": return "t0pSeCr3t".toCharArray();
+ *             case "guest": return "".toCharArray();
+ *             default: return null;
+ *         }
+ *     }
+ * };
+ * // Receive client request as type1
+ * byte[] type2 = server.type2(type1, nonce);
+ * // Send type2 to client and receive type3
+ * verify(type3, nonce);
+ * 
+ */ +public abstract class Server extends NTLM { + final private String domain; + final private boolean allVersion; + /** + * Creates a Server instance. + * @param version the NTLM version to use, which can be: + *
    + *
  • NTLM: Original NTLM v1 + *
  • NTLM2: NTLM v1 with Client Challenge + *
  • NTLMv2: NTLM v2 + *
+ * If null, all versions will be supported. Please note that unless NTLM2 + * is selected, authentication succeeds if one of LM (or LMv2) or + * NTLM (or NTLMv2) is verified. + * @param domain the domain, must not be null + * @throws NullPointerException if {@code domain} is null. + */ + public Server(String version, String domain) throws NTLMException { + super(version); + if (domain == null) { + throw new NullPointerException("domain cannot be null"); + } + this.allVersion = (version == null); + this.domain = domain; + debug("NTLM Server: (t,version) = (%s,%s)\n", domain, version); + } + + /** + * Generates the Type 2 message + * @param type1 the Type1 message received, must not be null + * @param nonce the random 8-byte array to be used in message generation, + * must not be null + * @return the message generated + * @throws NullPointerException if type1 or nonce is null + * @throws NTLMException if the incoming message is invalid + */ + public byte[] type2(byte[] type1, byte[] nonce) { + if (nonce == null) { + throw new NullPointerException("nonce cannot be null"); + } + debug("NTLM Server: Type 1 received\n"); + if (type1 != null) debug(type1); + Writer p = new Writer(2, 32); + int flags = 0x80205; + p.writeSecurityBuffer(12, domain, true); + p.writeInt(20, flags); + p.writeBytes(24, nonce); + debug("NTLM Server: Type 2 created\n"); + debug(p.getBytes()); + return p.getBytes(); + } + + /** + * Verifies the Type3 message received from client and returns + * various negotiated information. + * @param type3 the incoming Type3 message from client, must not be null + * @param nonce the same nonce provided in {@link #type2}, must not be null + * @return username and hostname of the client in a byte array + * @throws NullPointerException if {@code type3} or {@code nonce} is null + * @throws NTLMException if the incoming message is invalid + */ + public String[] verify(byte[] type3, byte[] nonce) + throws NTLMException { + if (type3 == null || nonce == null) { + throw new NullPointerException("type1 or nonce cannot be null"); + } + debug("NTLM Server: Type 3 received\n"); + if (type3 != null) debug(type3); + Reader r = new Reader(type3); + String username = r.readSecurityBuffer(36, true); + String hostname = r.readSecurityBuffer(44, true); + String incomingDomain = r.readSecurityBuffer(28, true); + /*if (incomingDomain != null && !incomingDomain.equals(domain)) { + throw new NTLMException(NTLMException.DOMAIN_UNMATCH, + "Wrong domain: " + incomingDomain + + " vs " + domain); // Needed? + }*/ + boolean verified = false; + char[] password = getPassword(domain, username); + if (password == null) { + throw new NTLMException(NTLMException.USER_UNKNOWN, + "Unknown user"); + } + byte[] incomingLM = r.readSecurityBuffer(12); + byte[] incomingNTLM = r.readSecurityBuffer(20); + + if (!verified && (allVersion || v == Version.NTLM)) { + if (incomingLM.length > 0) { + byte[] pw1 = getP1(password); + byte[] lmhash = calcLMHash(pw1); + byte[] lmresponse = calcResponse (lmhash, nonce); + if (Arrays.equals(lmresponse, incomingLM)) { + verified = true; + } + } + if (incomingNTLM.length > 0) { + byte[] pw2 = getP2(password); + byte[] nthash = calcNTHash(pw2); + byte[] ntresponse = calcResponse (nthash, nonce); + if (Arrays.equals(ntresponse, incomingNTLM)) { + verified = true; + } + } + debug("NTLM Server: verify using NTLM: " + verified + "\n"); + } + if (!verified && (allVersion || v == Version.NTLM2)) { + byte[] pw2 = getP2(password); + byte[] nthash = calcNTHash(pw2); + byte[] clientNonce = Arrays.copyOf(incomingLM, 8); + byte[] ntlmresponse = ntlm2NTLM(nthash, clientNonce, nonce); + if (Arrays.equals(incomingNTLM, ntlmresponse)) { + verified = true; + } + debug("NTLM Server: verify using NTLM2: " + verified + "\n"); + } + if (!verified && (allVersion || v == Version.NTLMv2)) { + byte[] pw2 = getP2(password); + byte[] nthash = calcNTHash(pw2); + if (incomingLM.length > 0) { + byte[] clientNonce = Arrays.copyOfRange( + incomingLM, 16, incomingLM.length); + byte[] lmresponse = calcV2(nthash, + username.toUpperCase(Locale.US)+incomingDomain, + clientNonce, nonce); + if (Arrays.equals(lmresponse, incomingLM)) { + verified = true; + } + } + if (incomingNTLM.length > 0) { + byte[] clientBlob = Arrays.copyOfRange( + incomingNTLM, 16, incomingNTLM.length); + byte[] ntlmresponse = calcV2(nthash, + username.toUpperCase(Locale.US)+incomingDomain, + clientBlob, nonce); + if (Arrays.equals(ntlmresponse, incomingNTLM)) { + verified = true; + } + } + debug("NTLM Server: verify using NTLMv2: " + verified + "\n"); + } + if (!verified) { + throw new NTLMException(NTLMException.AUTH_FAILED, + "None of LM and NTLM verified"); + } + return new String[] {username, hostname}; + } + + /** + * Retrieves the password for a given user. This method should be + * overridden in a concrete class. + * @param domain can be null + * @param username must not be null + * @return the password for the user, or null if unknown + */ + public abstract char[] getPassword(String domain, String username); +} diff --git a/jdk/src/share/classes/com/sun/security/ntlm/Version.java b/jdk/src/share/classes/com/sun/security/ntlm/Version.java new file mode 100644 index 00000000000..bd4d0c4a07d --- /dev/null +++ b/jdk/src/share/classes/com/sun/security/ntlm/Version.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.security.ntlm; + +enum Version { + NTLM, NTLM2, NTLMv2 +} diff --git a/jdk/src/share/classes/com/sun/security/sasl/Provider.java b/jdk/src/share/classes/com/sun/security/sasl/Provider.java index 8e43d59f357..8b9c00c8800 100644 --- a/jdk/src/share/classes/com/sun/security/sasl/Provider.java +++ b/jdk/src/share/classes/com/sun/security/sasl/Provider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,10 +35,12 @@ import java.security.PrivilegedAction; * - CRAM-MD5 * - DIGEST-MD5 * - GSSAPI/Kerberos v5 + * - NTLM * And server support for * - CRAM-MD5 * - DIGEST-MD5 * - GSSAPI/Kerberos v5 + * - NTLM */ public final class Provider extends java.security.Provider { @@ -47,8 +49,8 @@ public final class Provider extends java.security.Provider { private static final String info = "Sun SASL provider" + "(implements client mechanisms for: " + - "DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5;" + - " server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)"; + "DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM;" + + " server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)"; public Provider() { super("SunSASL", 1.7d, info); @@ -58,6 +60,8 @@ public final class Provider extends java.security.Provider { // Client mechanisms put("SaslClientFactory.DIGEST-MD5", "com.sun.security.sasl.digest.FactoryImpl"); + put("SaslClientFactory.NTLM", + "com.sun.security.sasl.ntlm.FactoryImpl"); put("SaslClientFactory.GSSAPI", "com.sun.security.sasl.gsskerb.FactoryImpl"); @@ -75,6 +79,8 @@ public final class Provider extends java.security.Provider { "com.sun.security.sasl.gsskerb.FactoryImpl"); put("SaslServerFactory.DIGEST-MD5", "com.sun.security.sasl.digest.FactoryImpl"); + put("SaslServerFactory.NTLM", + "com.sun.security.sasl.ntlm.FactoryImpl"); return null; } }); diff --git a/jdk/src/share/classes/com/sun/security/sasl/ntlm/FactoryImpl.java b/jdk/src/share/classes/com/sun/security/sasl/ntlm/FactoryImpl.java new file mode 100644 index 00000000000..6ee1b66f968 --- /dev/null +++ b/jdk/src/share/classes/com/sun/security/sasl/ntlm/FactoryImpl.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.security.sasl.ntlm; + +import java.util.Map; + +import javax.security.sasl.*; +import javax.security.auth.callback.CallbackHandler; + +import com.sun.security.sasl.util.PolicyUtils; + + +/** + * Client and server factory for NTLM SASL client/server mechanisms. + * See NTLMClient and NTLMServer for input requirements. + * + * @since 1.7 + */ + +public final class FactoryImpl implements SaslClientFactory, +SaslServerFactory{ + + private static final String myMechs[] = { "NTLM" }; + private static final int mechPolicies[] = { + PolicyUtils.NOPLAINTEXT|PolicyUtils.NOANONYMOUS + }; + + /** + * Empty constructor. + */ + public FactoryImpl() { + } + + /** + * Returns a new instance of the NTLM SASL client mechanism. + * Argument checks are performed in SaslClient's constructor. + * @returns a new SaslClient ; otherwise null if unsuccessful. + * @throws SaslException If there is an error creating the NTLM + * SASL client. + */ + public SaslClient createSaslClient(String[] mechs, + String authorizationId, String protocol, String serverName, + Map props, CallbackHandler cbh) + throws SaslException { + + for (int i=0; i props, CallbackHandler cbh) + throws SaslException { + + if (mech.equals("NTLM") && + PolicyUtils.checkPolicy(mechPolicies[0], props)) { + if (props != null) { + String qop = (String)props.get(Sasl.QOP); + if (qop != null && !qop.equals("auth")) { + throw new SaslException("NTLM only support auth"); + } + } + if (cbh == null) { + throw new SaslException( + "Callback handler with support for AuthorizeCallback, "+ + "RealmCallback, NameCallback, and PasswordCallback " + + "required"); + } + return new NTLMServer(mech, protocol, serverName, props, cbh); + } + return null; + } + + /** + * Returns the authentication mechanisms that this factory can produce. + * + * @returns String[] {"NTLM"} if policies in env match those of this + * factory. + */ + public String[] getMechanismNames(Map env) { + return PolicyUtils.filterMechs(myMechs, mechPolicies, env); + } +} diff --git a/jdk/src/share/classes/com/sun/security/sasl/ntlm/NTLMClient.java b/jdk/src/share/classes/com/sun/security/sasl/ntlm/NTLMClient.java new file mode 100644 index 00000000000..e5746675874 --- /dev/null +++ b/jdk/src/share/classes/com/sun/security/sasl/ntlm/NTLMClient.java @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.security.sasl.ntlm; + +import com.sun.security.ntlm.Client; +import com.sun.security.ntlm.NTLMException; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Map; +import java.util.Random; +import javax.security.auth.callback.Callback; + + +import javax.security.sasl.*; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.UnsupportedCallbackException; + +/** + * Required callbacks: + * - RealmCallback + * handle can provide domain info for authentication, optional + * - NameCallback + * handler must enter username to use for authentication + * - PasswordCallback + * handler must enter password for username to use for authentication + * + * Environment properties that affect behavior of implementation: + * + * javax.security.sasl.qop + * String, quality of protection; only "auth" is accepted, default "auth" + * + * com.sun.security.sasl.ntlm.version + * String, name a specific version to use; can be: + * LM/NTLM: Original NTLM v1 + * LM: Original NTLM v1, LM only + * NTLM: Original NTLM v1, NTLM only + * NTLM2: NTLM v1 with Client Challenge + * LMv2/NTLMv2: NTLM v2 + * LMv2: NTLM v2, LM only + * NTLMv2: NTLM v2, NTLM only + * If not specified, use system property "ntlm.version". If + * still not specified, use default value "LMv2/NTLMv2". + * + * com.sun.security.sasl.ntlm.random + * java.util.Random, the nonce source to be used in NTLM v2 or NTLM v1 with + * Client Challenge. Default null, an internal java.util.Random object + * will be used + * + * Negotiated Properties: + * + * javax.security.sasl.qop + * Always "auth" + * + * com.sun.security.sasl.html.domain + * The domain for the user, provided by the server + * + * @see RFC 2222 + * - Simple Authentication and Security Layer (SASL) + * + */ +final class NTLMClient implements SaslClient { + + private static final String NTLM_VERSION = + "com.sun.security.sasl.ntlm.version"; + private static final String NTLM_RANDOM = + "com.sun.security.sasl.ntlm.random"; + private final static String NTLM_DOMAIN = + "com.sun.security.sasl.ntlm.domain"; + private final static String NTLM_HOSTNAME = + "com.sun.security.sasl.ntlm.hostname"; + + private final Client client; + private final String mech; + private final Random random; + + private int step = 0; // 0-start,1-nego,2-auth,3-done + + /** + * @param mech non-null + * @param authorizationId can be null or empty and ignored + * @param protocol non-null for Sasl, useless for NTLM + * @param serverName non-null for Sasl, but can be null for NTLM + * @param props can be null + * @param cbh can be null for Sasl, but will throw NPE for NTLM + * @throws SaslException + */ + NTLMClient(String mech, String authzid, String protocol, String serverName, + Map props, CallbackHandler cbh) throws SaslException { + + this.mech = mech; + String version = null; + Random rtmp = null; + String hostname = null; + + if (props != null) { + String qop = (String)props.get(Sasl.QOP); + if (qop != null && !qop.equals("auth")) { + throw new SaslException("NTLM only support auth"); + } + version = (String)props.get(NTLM_VERSION); + rtmp = (Random)props.get(NTLM_RANDOM); + hostname = (String)props.get(NTLM_HOSTNAME); + } + this.random = rtmp != null ? rtmp : new Random(); + + if (version == null) { + version = System.getProperty("ntlm.version"); + } + + RealmCallback dcb = (serverName != null && !serverName.isEmpty())? + new RealmCallback("Realm: ", serverName) : + new RealmCallback("Realm: "); + NameCallback ncb = (authzid != null && !authzid.isEmpty()) ? + new NameCallback("User name: ", authzid) : + new NameCallback("User name: "); + PasswordCallback pcb = + new PasswordCallback("Password: ", false); + + try { + cbh.handle(new Callback[] {dcb, ncb, pcb}); + } catch (UnsupportedCallbackException e) { + throw new SaslException("NTLM: Cannot perform callback to " + + "acquire realm, username or password", e); + } catch (IOException e) { + throw new SaslException( + "NTLM: Error acquiring realm, username or password", e); + } + + if (hostname == null) { + try { + hostname = InetAddress.getLocalHost().getCanonicalHostName(); + } catch (UnknownHostException e) { + hostname = "localhost"; + } + } + try { + client = new Client(version, hostname, + ncb.getName(), + dcb.getText(), + pcb.getPassword()); + } catch (NTLMException ne) { + throw new SaslException( + "NTLM: Invalid version string: " + version, ne); + } + } + + @Override + public String getMechanismName() { + return mech; + } + + @Override + public boolean isComplete() { + return step >= 2; + } + + @Override + public byte[] unwrap(byte[] incoming, int offset, int len) + throws SaslException { + throw new UnsupportedOperationException("Not supported."); + } + + @Override + public byte[] wrap(byte[] outgoing, int offset, int len) + throws SaslException { + throw new UnsupportedOperationException("Not supported."); + } + + @Override + public Object getNegotiatedProperty(String propName) { + if (propName.equals(Sasl.QOP)) { + return "auth"; + } else if (propName.equals(NTLM_DOMAIN)) { + return client.getDomain(); + } else { + return null; + } + } + + @Override + public void dispose() throws SaslException { + client.dispose(); + } + + @Override + public boolean hasInitialResponse() { + return true; + } + + @Override + public byte[] evaluateChallenge(byte[] challenge) throws SaslException { + step++; + if (step == 1) { + return client.type1(); + } else { + try { + byte[] nonce = new byte[8]; + random.nextBytes(nonce); + return client.type3(challenge, nonce); + } catch (NTLMException ex) { + throw new SaslException("Type3 creation failed", ex); + } + } + } +} diff --git a/jdk/src/share/classes/com/sun/security/sasl/ntlm/NTLMServer.java b/jdk/src/share/classes/com/sun/security/sasl/ntlm/NTLMServer.java new file mode 100644 index 00000000000..7adbeb7d37e --- /dev/null +++ b/jdk/src/share/classes/com/sun/security/sasl/ntlm/NTLMServer.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.security.sasl.ntlm; + +import com.sun.security.ntlm.NTLMException; +import com.sun.security.ntlm.Server; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Map; +import java.util.Random; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.UnsupportedCallbackException; +import javax.security.sasl.*; + +/** + * Required callbacks: + * - RealmCallback + * used as key by handler to fetch password, optional + * - NameCallback + * used as key by handler to fetch password + * - PasswordCallback + * handler must enter password for username/realm supplied + * + * Environment properties that affect the implementation: + * + * javax.security.sasl.qop + * String, quality of protection; only "auth" is accepted, default "auth" + * + * com.sun.security.sasl.ntlm.version + * String, name a specific version to accept: + * LM/NTLM: Original NTLM v1 + * LM: Original NTLM v1, LM only + * NTLM: Original NTLM v1, NTLM only + * NTLM2: NTLM v1 with Client Challenge + * LMv2/NTLMv2: NTLM v2 + * LMv2: NTLM v2, LM only + * NTLMv2: NTLM v2, NTLM only + * If not specified, use system property "ntlm.version". If also + * not specfied, all versions are accepted. + * + * com.sun.security.sasl.ntlm.domain + * String, the domain of the server, default is server name (fqdn parameter) + * + * com.sun.security.sasl.ntlm.random + * java.util.Random, the nonce source. Default null, an internal + * java.util.Random object will be used + * + * Negotiated Properties: + * + * javax.security.sasl.qop + * Always "auth" + * + * com.sun.security.sasl.ntlm.hostname + * The hostname for the user, provided by the client + * + */ + +final class NTLMServer implements SaslServer { + + private final static String NTLM_VERSION = + "com.sun.security.sasl.ntlm.version"; + private final static String NTLM_DOMAIN = + "com.sun.security.sasl.ntlm.domain"; + private final static String NTLM_HOSTNAME = + "com.sun.security.sasl.ntlm.hostname"; + private static final String NTLM_RANDOM = + "com.sun.security.sasl.ntlm.random"; + + private final Random random; + private final Server server; + private byte[] nonce; + private int step = 0; + private String authzId; + private final String mech; + private String hostname; + + /** + * @param mech not null + * @param protocol not null for Sasl, ignored in NTLM + * @param serverName not null for Sasl, can be null in NTLM. If non-null, + * might be used as domain if not provided in props + * @param props can be null + * @param cbh can be null for Sasl, but will throw NPE in auth for NTLM + * @throws SaslException + */ + NTLMServer(String mech, String protocol, String serverName, + Map props, final CallbackHandler cbh) throws SaslException { + + this.mech = mech; + String version = null; + String domain = null; + Random rtmp = null; + + if (props != null) { + domain = (String) props.get(NTLM_DOMAIN); + version = (String)props.get(NTLM_VERSION); + rtmp = (Random)props.get(NTLM_RANDOM); + } + random = rtmp != null ? rtmp : new Random(); + + if (version == null) { + version = System.getProperty("ntlm.version"); + } + if (domain == null) { + domain = serverName; + } + if (domain == null) { + throw new NullPointerException("Domain must be provided as" + + " the serverName argument or in props"); + } + + try { + server = new Server(version, domain) { + public char[] getPassword(String ntdomain, String username) { + try { + RealmCallback rcb = new RealmCallback( + "Domain: ", ntdomain); + NameCallback ncb = new NameCallback( + "Name: ", username); + PasswordCallback pcb = new PasswordCallback( + "Password: ", false); + cbh.handle(new Callback[] { rcb, ncb, pcb }); + char[] passwd = pcb.getPassword(); + pcb.clearPassword(); + return passwd; + } catch (IOException ioe) { + return null; + } catch (UnsupportedCallbackException uce) { + return null; + } + } + }; + } catch (NTLMException ne) { + throw new SaslException( + "NTLM: Invalid version string: " + version, ne); + } + nonce = new byte[8]; + } + + @Override + public String getMechanismName() { + return mech; + } + + @Override + public byte[] evaluateResponse(byte[] response) throws SaslException { + try { + step++; + if (step == 1) { + random.nextBytes(nonce); + return server.type2(response, nonce); + } else { + String[] out = server.verify(response, nonce); + authzId = out[0]; + hostname = out[1]; + return null; + } + } catch (GeneralSecurityException ex) { + throw new SaslException("", ex); + } + } + + @Override + public boolean isComplete() { + return step >= 2; + } + + @Override + public String getAuthorizationID() { + return authzId; + } + + @Override + public byte[] unwrap(byte[] incoming, int offset, int len) + throws SaslException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public byte[] wrap(byte[] outgoing, int offset, int len) + throws SaslException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Object getNegotiatedProperty(String propName) { + if (propName.equals(Sasl.QOP)) { + return "auth"; + } else if (propName.equals(NTLM_HOSTNAME)) { + return hostname; + } else { + return null; + } + } + + @Override + public void dispose() throws SaslException { + return; + } +} diff --git a/jdk/src/solaris/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java b/jdk/src/solaris/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java index 0c8a5e28f4c..5ad8b8d54d8 100644 --- a/jdk/src/solaris/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java +++ b/jdk/src/solaris/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,20 +25,14 @@ package sun.net.www.protocol.http.ntlm; +import com.sun.security.ntlm.Client; +import com.sun.security.ntlm.NTLMException; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.PasswordAuthentication; import java.net.UnknownHostException; import java.net.URL; import java.security.GeneralSecurityException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import javax.crypto.Cipher; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.DESKeySpec; import sun.net.www.HeaderParser; import sun.net.www.protocol.http.AuthenticationInfo; @@ -72,14 +66,8 @@ import sun.net.www.protocol.http.HttpURLConnection; */ public class NTLMAuthentication extends AuthenticationInfo { - private static final long serialVersionUID = -2403849171106437142L; + private static final long serialVersionUID = 170L; - private byte[] type1; - private byte[] type3; - - private SecretKeyFactory fac; - private Cipher cipher; - private MessageDigest md4; private String hostname; private static String defaultDomain; /* Domain to use if not specified by user */ @@ -94,53 +82,28 @@ public class NTLMAuthentication extends AuthenticationInfo { } private void init0() { - type1 = new byte[256]; - type3 = new byte[256]; - System.arraycopy (new byte[] {'N','T','L','M','S','S','P',0,1}, 0, type1, 0, 9); - type1[12] = (byte) 3; - type1[13] = (byte) 0xb2; - type1[28] = (byte) 0x20; - System.arraycopy (new byte[] {'N','T','L','M','S','S','P',0,3}, 0, type3, 0, 9); - type3[12] = (byte) 0x18; - type3[14] = (byte) 0x18; - type3[20] = (byte) 0x18; - type3[22] = (byte) 0x18; - type3[32] = (byte) 0x40; - type3[60] = (byte) 1; - type3[61] = (byte) 0x82; - try { - hostname = java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public String run() { - String localhost; - try { - localhost = InetAddress.getLocalHost().getHostName().toUpperCase(); - } catch (UnknownHostException e) { - localhost = "localhost"; - } - return localhost; + hostname = java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction() { + public String run() { + String localhost; + try { + localhost = InetAddress.getLocalHost().getHostName().toUpperCase(); + } catch (UnknownHostException e) { + localhost = "localhost"; } - }); - int x = hostname.indexOf ('.'); - if (x != -1) { - hostname = hostname.substring (0, x); + return localhost; } - fac = SecretKeyFactory.getInstance ("DES"); - cipher = Cipher.getInstance ("DES/ECB/NoPadding"); - md4 = sun.security.provider.MD4.getInstance(); - } catch (NoSuchPaddingException e) { - assert false; - } catch (NoSuchAlgorithmException e) { - assert false; + }); + int x = hostname.indexOf ('.'); + if (x != -1) { + hostname = hostname.substring (0, x); } }; PasswordAuthentication pw; - String username; - String ntdomain; - String password; + Client client; /** * Create a NTLMAuthentication: * Username may be specified as domainusername in the application Authenticator. @@ -156,6 +119,9 @@ public class NTLMAuthentication extends AuthenticationInfo { } private void init (PasswordAuthentication pw) { + String username; + String ntdomain; + char[] password; this.pw = pw; String s = pw.getUserName(); int i = s.indexOf ('\\'); @@ -166,8 +132,19 @@ public class NTLMAuthentication extends AuthenticationInfo { ntdomain = s.substring (0, i).toUpperCase(); username = s.substring (i+1); } - password = new String (pw.getPassword()); + password = pw.getPassword(); init0(); + try { + client = new Client(System.getProperty("ntlm.version"), hostname, + username, ntdomain, password); + } catch (NTLMException ne) { + try { + client = new Client(null, hostname, username, ntdomain, password); + } catch (NTLMException ne2) { + // Will never happen + throw new AssertionError("Really?"); + } + } } /** @@ -240,181 +217,26 @@ public class NTLMAuthentication extends AuthenticationInfo { } } - private void copybytes (byte[] dest, int destpos, String src, String enc) { - try { - byte[] x = src.getBytes(enc); - System.arraycopy (x, 0, dest, destpos, x.length); - } catch (UnsupportedEncodingException e) { - assert false; - } - } - private String buildType1Msg () { - int dlen = ntdomain.length(); - type1[16]= (byte) (dlen % 256); - type1[17]= (byte) (dlen / 256); - type1[18] = type1[16]; - type1[19] = type1[17]; - - int hlen = hostname.length(); - type1[24]= (byte) (hlen % 256); - type1[25]= (byte) (hlen / 256); - type1[26] = type1[24]; - type1[27] = type1[25]; - - copybytes (type1, 32, hostname, "ISO8859_1"); - copybytes (type1, hlen+32, ntdomain, "ISO8859_1"); - type1[20] = (byte) ((hlen+32) % 256); - type1[21] = (byte) ((hlen+32) / 256); - - byte[] msg = new byte [32 + hlen + dlen]; - System.arraycopy (type1, 0, msg, 0, 32 + hlen + dlen); + byte[] msg = client.type1(); String result = "NTLM " + (new B64Encoder()).encode (msg); return result; } - - /* Convert a 7 byte array to an 8 byte array (for a des key with parity) - * input starts at offset off - */ - private byte[] makeDesKey (byte[] input, int off) { - int[] in = new int [input.length]; - for (int i=0; i> 1)); - out[2] = (byte)(((in[off+1] << 6) & 0xFF) | (in[off+2] >> 2)); - out[3] = (byte)(((in[off+2] << 5) & 0xFF) | (in[off+3] >> 3)); - out[4] = (byte)(((in[off+3] << 4) & 0xFF) | (in[off+4] >> 4)); - out[5] = (byte)(((in[off+4] << 3) & 0xFF) | (in[off+5] >> 5)); - out[6] = (byte)(((in[off+5] << 2) & 0xFF) | (in[off+6] >> 6)); - out[7] = (byte)((in[off+6] << 1) & 0xFF); - return out; - } - - private byte[] calcLMHash () throws GeneralSecurityException { - byte[] magic = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25}; - byte[] pwb = password.toUpperCase ().getBytes(); - byte[] pwb1 = new byte [14]; - int len = password.length(); - if (len > 14) - len = 14; - System.arraycopy (pwb, 0, pwb1, 0, len); /* Zero padded */ - - DESKeySpec dks1 = new DESKeySpec (makeDesKey (pwb1, 0)); - DESKeySpec dks2 = new DESKeySpec (makeDesKey (pwb1, 7)); - - SecretKey key1 = fac.generateSecret (dks1); - SecretKey key2 = fac.generateSecret (dks2); - cipher.init (Cipher.ENCRYPT_MODE, key1); - byte[] out1 = cipher.doFinal (magic, 0, 8); - cipher.init (Cipher.ENCRYPT_MODE, key2); - byte[] out2 = cipher.doFinal (magic, 0, 8); - - byte[] result = new byte [21]; - System.arraycopy (out1, 0, result, 0, 8); - System.arraycopy (out2, 0, result, 8, 8); - return result; - } - - private byte[] calcNTHash () throws GeneralSecurityException { - byte[] pw = null; - try { - pw = password.getBytes ("UnicodeLittleUnmarked"); - } catch (UnsupportedEncodingException e) { - assert false; - } - byte[] out = md4.digest (pw); - byte[] result = new byte [21]; - System.arraycopy (out, 0, result, 0, 16); - return result; - } - - /* key is a 21 byte array. Split it into 3 7 byte chunks, - * Convert each to 8 byte DES keys, encrypt the text arg with - * each key and return the three results in a sequential [] - */ - private byte[] calcResponse (byte[] key, byte[] text) - throws GeneralSecurityException { - assert key.length == 21; - DESKeySpec dks1 = new DESKeySpec (makeDesKey (key, 0)); - DESKeySpec dks2 = new DESKeySpec (makeDesKey (key, 7)); - DESKeySpec dks3 = new DESKeySpec (makeDesKey (key, 14)); - SecretKey key1 = fac.generateSecret (dks1); - SecretKey key2 = fac.generateSecret (dks2); - SecretKey key3 = fac.generateSecret (dks3); - cipher.init (Cipher.ENCRYPT_MODE, key1); - byte[] out1 = cipher.doFinal (text, 0, 8); - cipher.init (Cipher.ENCRYPT_MODE, key2); - byte[] out2 = cipher.doFinal (text, 0, 8); - cipher.init (Cipher.ENCRYPT_MODE, key3); - byte[] out3 = cipher.doFinal (text, 0, 8); - byte[] result = new byte [24]; - System.arraycopy (out1, 0, result, 0, 8); - System.arraycopy (out2, 0, result, 8, 8); - System.arraycopy (out3, 0, result, 16, 8); - return result; - } - private String buildType3Msg (String challenge) throws GeneralSecurityException, IOException { /* First decode the type2 message to get the server nonce */ /* nonce is located at type2[24] for 8 bytes */ byte[] type2 = (new sun.misc.BASE64Decoder()).decodeBuffer (challenge); - byte[] nonce = new byte [8]; - System.arraycopy (type2, 24, nonce, 0, 8); - - int ulen = username.length()*2; - type3[36] = type3[38] = (byte) (ulen % 256); - type3[37] = type3[39] = (byte) (ulen / 256); - int dlen = ntdomain.length()*2; - type3[28] = type3[30] = (byte) (dlen % 256); - type3[29] = type3[31] = (byte) (dlen / 256); - int hlen = hostname.length()*2; - type3[44] = type3[46] = (byte) (hlen % 256); - type3[45] = type3[47] = (byte) (hlen / 256); - - int l = 64; - copybytes (type3, l, ntdomain, "UnicodeLittleUnmarked"); - type3[32] = (byte) (l % 256); - type3[33] = (byte) (l / 256); - l += dlen; - copybytes (type3, l, username, "UnicodeLittleUnmarked"); - type3[40] = (byte) (l % 256); - type3[41] = (byte) (l / 256); - l += ulen; - copybytes (type3, l, hostname, "UnicodeLittleUnmarked"); - type3[48] = (byte) (l % 256); - type3[49] = (byte) (l / 256); - l += hlen; - - byte[] lmhash = calcLMHash(); - byte[] lmresponse = calcResponse (lmhash, nonce); - byte[] nthash = calcNTHash(); - byte[] ntresponse = calcResponse (nthash, nonce); - System.arraycopy (lmresponse, 0, type3, l, 24); - type3[16] = (byte) (l % 256); - type3[17] = (byte) (l / 256); - l += 24; - System.arraycopy (ntresponse, 0, type3, l, 24); - type3[24] = (byte) (l % 256); - type3[25] = (byte) (l / 256); - l += 24; - type3[56] = (byte) (l % 256); - type3[57] = (byte) (l / 256); - - byte[] msg = new byte [l]; - System.arraycopy (type3, 0, msg, 0, l); + byte[] nonce = new byte[8]; + new java.util.Random().nextBytes(nonce); + byte[] msg = client.type3(type2, nonce); String result = "NTLM " + (new B64Encoder()).encode (msg); return result; } - } - class B64Encoder extends sun.misc.BASE64Encoder { /* to force it to to the entire encoding in one line */ protected int bytesPerLine () { diff --git a/jdk/test/com/sun/security/sasl/ntlm/NTLMTest.java b/jdk/test/com/sun/security/sasl/ntlm/NTLMTest.java new file mode 100644 index 00000000000..64a5f8e54e2 --- /dev/null +++ b/jdk/test/com/sun/security/sasl/ntlm/NTLMTest.java @@ -0,0 +1,416 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6911951 + * @summary NTLM should be a supported Java SASL mechanism + */ +import java.io.IOException; +import javax.security.sasl.*; +import javax.security.auth.callback.*; +import java.util.*; + +import com.sun.security.ntlm.NTLMException; + +public class NTLMTest { + + private static final String MECH = "NTLM"; + private static final String REALM = "REALM"; + private static final String PROTOCOL = "jmx"; + private static final byte[] EMPTY = new byte[0]; + + private static final String USER1 = "dummy"; + private static final char[] PASS1 = "bogus".toCharArray(); + private static final String USER2 = "foo"; + private static final char[] PASS2 = "bar".toCharArray(); + + private static final Map maps = + new HashMap(); + static { + maps.put(USER1, PASS1); + maps.put(USER2, PASS2); + } + + static char[] getPass(String d, String u) { + if (!d.equals(REALM)) return null; + return maps.get(u); + } + + public static void main(String[] args) throws Exception { + + checkAuthOnly(); + checkClientNameOverride(); + checkServerDomainOverride(); + checkClientDomainOverride(); + checkVersions(); + checkClientHostname(); + } + + static void checkVersions() throws Exception { + // Server accepts all version + checkVersion(null, null); + checkVersion("LM/NTLM", null); + checkVersion("LM", null); + checkVersion("NTLM", null); + checkVersion("NTLM2", null); + checkVersion("LMv2/NTLMv2", null); + checkVersion("LMv2", null); + checkVersion("NTLMv2", null); + + // Client's default version is LMv2 + checkVersion(null, "LMv2"); + + // Also works if they specified identical versions + checkVersion("LM/NTLM", "LM"); + checkVersion("LM", "LM"); + checkVersion("NTLM", "LM"); + checkVersion("NTLM2", "NTLM2"); + checkVersion("LMv2/NTLMv2", "LMv2"); + checkVersion("LMv2", "LMv2"); + checkVersion("NTLMv2", "LMv2"); + + // But should not work if different + try { + checkVersion("LM/NTLM", "LMv2"); + throw new Exception("Should not succeed"); + } catch (SaslException se) { + NTLMException ne = (NTLMException)se.getCause(); + if (ne.errorCode() != NTLMException.AUTH_FAILED) { + throw new Exception("Failed false"); + } + } + try { + checkVersion("LMv2/NTLMv2", "LM"); + throw new Exception("Should not succeed"); + } catch (SaslException se) { + NTLMException ne = (NTLMException)se.getCause(); + if (ne.errorCode() != NTLMException.AUTH_FAILED) { + throw new Exception("Failed false"); + } + } + + } + + /** + * A test on version matching + * @param vc ntlm version specified for client + * @param vs ntlm version specified for server + * @throws Exception + */ + private static void checkVersion(String vc, String vs) throws Exception { + Map pc = new HashMap<>(); + pc.put("com.sun.security.sasl.ntlm.version", vc); + Map ps = new HashMap<>(); + ps.put("com.sun.security.sasl.ntlm.version", vs); + SaslClient clnt = Sasl.createSaslClient( + new String[]{MECH}, USER1, PROTOCOL, null, pc, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + NameCallback ncb = (NameCallback)cb; + ncb.setName(ncb.getDefaultName()); + } else if (cb instanceof PasswordCallback) { + ((PasswordCallback)cb).setPassword(PASS1); + } + } + } + }); + + SaslServer srv = Sasl.createSaslServer(MECH, PROTOCOL, REALM, ps, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + String domain = null, name = null; + PasswordCallback pcb = null; + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + name = ((NameCallback)cb).getDefaultName(); + } else if (cb instanceof RealmCallback) { + domain = ((RealmCallback)cb).getDefaultText(); + } else if (cb instanceof PasswordCallback) { + pcb = (PasswordCallback)cb; + } + } + if (pcb != null) { + pcb.setPassword(getPass(domain, name)); + } + } + }); + + handshake(clnt, srv); + } + + private static void checkClientHostname() throws Exception { + Map pc = new HashMap<>(); + pc.put("com.sun.security.sasl.ntlm.hostname", "this.is.com"); + SaslClient clnt = Sasl.createSaslClient( + new String[]{MECH}, USER1, PROTOCOL, null, pc, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + NameCallback ncb = (NameCallback)cb; + ncb.setName(ncb.getDefaultName()); + } else if (cb instanceof PasswordCallback) { + ((PasswordCallback)cb).setPassword(PASS1); + } + } + } + }); + + SaslServer srv = Sasl.createSaslServer(MECH, PROTOCOL, REALM, null, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + String domain = null, name = null; + PasswordCallback pcb = null; + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + name = ((NameCallback)cb).getDefaultName(); + } else if (cb instanceof RealmCallback) { + domain = ((RealmCallback)cb).getDefaultText(); + } else if (cb instanceof PasswordCallback) { + pcb = (PasswordCallback)cb; + } + } + if (pcb != null) { + pcb.setPassword(getPass(domain, name)); + } + } + }); + + handshake(clnt, srv); + if (!"this.is.com".equals( + srv.getNegotiatedProperty("com.sun.security.sasl.ntlm.hostname"))) { + throw new Exception("Hostname not trasmitted to server"); + } + } + + /** + * Client realm override, but finally overridden by server response + */ + private static void checkClientDomainOverride() throws Exception { + SaslClient clnt = Sasl.createSaslClient( + new String[]{MECH}, USER1, PROTOCOL, "ANOTHERREALM", null, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + NameCallback ncb = (NameCallback)cb; + ncb.setName(ncb.getDefaultName()); + } else if(cb instanceof RealmCallback) { + RealmCallback dcb = (RealmCallback)cb; + dcb.setText("THIRDDOMAIN"); + } else if (cb instanceof PasswordCallback) { + ((PasswordCallback)cb).setPassword(PASS1); + } + } + } + }); + + SaslServer srv = Sasl.createSaslServer(MECH, PROTOCOL, REALM, null, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + String domain = null, name = null; + PasswordCallback pcb = null; + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + name = ((NameCallback)cb).getDefaultName(); + } else if (cb instanceof RealmCallback) { + domain = ((RealmCallback)cb).getDefaultText(); + } else if (cb instanceof PasswordCallback) { + pcb = (PasswordCallback)cb; + } + } + if (pcb != null) { + pcb.setPassword(getPass(domain, name)); + } + } + }); + + handshake(clnt, srv); + } + + /** + * Client side user name provided in callback. + * @throws Exception + */ + private static void checkClientNameOverride() throws Exception { + SaslClient clnt = Sasl.createSaslClient( + new String[]{MECH}, null, PROTOCOL, null, null, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + NameCallback ncb = (NameCallback)cb; + ncb.setName(USER1); + } else if (cb instanceof PasswordCallback) { + ((PasswordCallback)cb).setPassword(PASS1); + } + } + } + }); + + SaslServer srv = Sasl.createSaslServer(MECH, PROTOCOL, REALM, null, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + String domain = null, name = null; + PasswordCallback pcb = null; + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + name = ((NameCallback)cb).getDefaultName(); + } else if (cb instanceof RealmCallback) { + domain = ((RealmCallback)cb).getDefaultText(); + } else if (cb instanceof PasswordCallback) { + pcb = (PasswordCallback)cb; + } + } + if (pcb != null) { + pcb.setPassword(getPass(domain, name)); + } + } + }); + + handshake(clnt, srv); + } + + /** + * server side domain provided in props. + * @throws Exception + */ + private static void checkServerDomainOverride() throws Exception { + SaslClient clnt = Sasl.createSaslClient( + new String[]{MECH}, USER1, PROTOCOL, null, null, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + NameCallback ncb = (NameCallback)cb; + ncb.setName(ncb.getDefaultName()); + } else if (cb instanceof PasswordCallback) { + ((PasswordCallback)cb).setPassword(PASS1); + } + } + } + }); + + Map ps = new HashMap<>(); + ps.put("com.sun.security.sasl.ntlm.domain", REALM); + SaslServer srv = Sasl.createSaslServer(MECH, PROTOCOL, null, ps, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + String domain = null, name = null; + PasswordCallback pcb = null; + for (Callback cb: callbacks) { + if (cb instanceof NameCallback) { + name = ((NameCallback)cb).getDefaultName(); + } else if (cb instanceof RealmCallback) { + domain = ((RealmCallback)cb).getDefaultText(); + } else if (cb instanceof PasswordCallback) { + pcb = (PasswordCallback)cb; + } + } + if (pcb != null) { + pcb.setPassword(getPass(domain, name)); + } + } + }); + + handshake(clnt, srv); + } + + private static void checkAuthOnly() throws Exception { + Map props = new HashMap<>(); + props.put(Sasl.QOP, "auth-conf"); + try { + Sasl.createSaslClient( + new String[]{MECH}, USER2, PROTOCOL, REALM, props, null); + throw new Exception("NTLM should not support auth-conf"); + } catch (SaslException se) { + // Normal + } + } + + private static void handshake(SaslClient clnt, SaslServer srv) + throws Exception { + if (clnt == null) { + throw new IllegalStateException( + "Unable to find client impl for " + MECH); + } + if (srv == null) { + throw new IllegalStateException( + "Unable to find server impl for " + MECH); + } + + byte[] response = (clnt.hasInitialResponse() + ? clnt.evaluateChallenge(EMPTY) : EMPTY); + System.out.println("Initial:"); + new sun.misc.HexDumpEncoder().encodeBuffer(response, System.out); + byte[] challenge; + + while (!clnt.isComplete() || !srv.isComplete()) { + challenge = srv.evaluateResponse(response); + response = null; + if (challenge != null) { + System.out.println("Challenge:"); + new sun.misc.HexDumpEncoder().encodeBuffer(challenge, System.out); + response = clnt.evaluateChallenge(challenge); + } + if (response != null) { + System.out.println("Response:"); + new sun.misc.HexDumpEncoder().encodeBuffer(response, System.out); + } + } + + if (clnt.isComplete() && srv.isComplete()) { + System.out.println("SUCCESS"); + if (!srv.getAuthorizationID().equals(USER1)) { + throw new Exception("Not correct user"); + } + } else { + throw new IllegalStateException( + "FAILURE: mismatched state:" + + " client complete? " + clnt.isComplete() + + " server complete? " + srv.isComplete()); + } + + if (!clnt.getNegotiatedProperty(Sasl.QOP).equals("auth") || + !srv.getNegotiatedProperty(Sasl.QOP).equals("auth") || + !clnt.getNegotiatedProperty( + "com.sun.security.sasl.ntlm.domain").equals(REALM)) { + throw new Exception("Negotiated property error"); + } + clnt.dispose(); + srv.dispose(); + } +} From 1edc810119e161a5c5791f3212d8b15b77ff045b Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Mon, 30 Aug 2010 14:39:42 -0700 Subject: [PATCH 017/128] 6981043: Clean out all native code makefile logic from corba repository Reviewed-by: jjg --- corba/make/Makefile | 1 - corba/make/common/Defs-linux.gmk | 296 --------- corba/make/common/Defs-solaris.gmk | 607 ------------------ corba/make/common/Defs-windows.gmk | 356 ---------- corba/make/common/Defs.gmk | 124 +--- corba/make/common/Library.gmk | 275 -------- corba/make/common/Mapfile-vers.gmk | 98 --- corba/make/common/Rules.gmk | 53 +- .../common/internal/NativeCompileRules.gmk | 214 ------ corba/make/common/shared/Compiler-gcc.gmk | 119 ---- corba/make/common/shared/Compiler-msvc.gmk | 186 ------ corba/make/common/shared/Compiler-sun.gmk | 69 -- corba/make/common/shared/Compiler.gmk | 47 -- corba/make/common/shared/Defs-java.gmk | 11 +- corba/make/common/shared/Defs-linux.gmk | 8 - corba/make/common/shared/Defs-solaris.gmk | 18 - corba/make/common/shared/Defs-windows.gmk | 170 +---- corba/make/common/shared/Defs.gmk | 11 +- corba/make/common/shared/Platform.gmk | 56 +- corba/make/org/omg/idl/Makefile | 6 - 20 files changed, 11 insertions(+), 2714 deletions(-) delete mode 100644 corba/make/common/Library.gmk delete mode 100644 corba/make/common/Mapfile-vers.gmk delete mode 100644 corba/make/common/internal/NativeCompileRules.gmk delete mode 100644 corba/make/common/shared/Compiler-gcc.gmk delete mode 100644 corba/make/common/shared/Compiler-msvc.gmk delete mode 100644 corba/make/common/shared/Compiler-sun.gmk delete mode 100644 corba/make/common/shared/Compiler.gmk diff --git a/corba/make/Makefile b/corba/make/Makefile index 8501686c411..b8a71915079 100644 --- a/corba/make/Makefile +++ b/corba/make/Makefile @@ -61,7 +61,6 @@ ABS_OUTPUTDIR = $(call FullPath,$(OUTPUTDIR)) CLASSES_DIR = $(BUILD_DIR)/classes GENSRC_DIR = $(BUILD_DIR)/gensrc -BIN_DIR = $(DIST_DIR)/bin LIB_DIR = $(DIST_DIR)/lib #----- diff --git a/corba/make/common/Defs-linux.gmk b/corba/make/common/Defs-linux.gmk index 785cd205302..a5ef1d36b29 100644 --- a/corba/make/common/Defs-linux.gmk +++ b/corba/make/common/Defs-linux.gmk @@ -28,306 +28,10 @@ # targeted to Linux. Should not contain any rules. # -# Warning: the following variables are overriden by Defs.gmk. Set -# values will be silently ignored: -# CFLAGS (set $(OTHER_CFLAGS) instead) -# CPPFLAGS (set $(OTHER_CPPFLAGS) instead) -# CXXFLAGS (set $(OTHER_CXXFLAGS) instead) -# LDFLAGS (set $(OTHER_LDFAGS) instead) -# LDLIBS (set $(EXTRA_LIBS) instead) -# LDLIBS_COMMON (set $(EXTRA_LIBS) instead) - # Get shared JDK settings include $(BUILDDIR)/common/shared/Defs.gmk -# Part of INCREMENTAL_BUILD mechanism. -# Compiler emits things like: path/file.o: file.h -# We want something like: relative_path/file.o relative_path/file.d: file.h -CC_DEPEND = -MM -CC_DEPEND_FILTER = $(SED) -e 's!$*\.$(OBJECT_SUFFIX)!$(dir $@)& $(dir $@)$*.$(DEPEND_SUFFIX)!g' - ifndef PLATFORM_SRC PLATFORM_SRC = $(TOPDIR)/src/solaris endif # PLATFORM_SRC -# platform specific include files -PLATFORM_INCLUDE_NAME = $(PLATFORM) -PLATFORM_INCLUDE = $(INCLUDEDIR)/$(PLATFORM_INCLUDE_NAME) - -# suffix used for make dependencies files. -DEPEND_SUFFIX = d -# The suffix applied to the library name for FDLIBM -FDDLIBM_SUFFIX = a -# The suffix applied to scripts (.bat for windows, nothing for unix) -SCRIPT_SUFFIX = -# CC compiler object code output directive flag value -CC_OBJECT_OUTPUT_FLAG = -o #trailing blank required! -CC_PROGRAM_OUTPUT_FLAG = -o #trailing blank required! - -# -# Default HPI libraries. Build will build only native, unless -# overriden at the make command line. This makes it convenient for -# people doing, say, a pthreads port -- they can create a posix -# directory here, and say "gnumake HPIS=posix" at the top -# level. -# -HPIS = native - -# -# Default optimization -# -CC_HIGHEST_OPT = -O3 -CC_HIGHER_OPT = -O3 -CC_LOWER_OPT = -O2 -CC_NO_OPT = - -ifeq ($(PRODUCT), java) - _OPT = $(CC_HIGHER_OPT) -else - _OPT = $(CC_LOWER_OPT) - CPPFLAGS_DBG += -DLOGGING -endif - -# For all platforms, do not omit the frame pointer register usage. -# We need this frame pointer to make it easy to walk the stacks. -# This should be the default on X86, but ia64 and amd64 may not have this -# as the default. -CFLAGS_REQUIRED_amd64 += -fno-omit-frame-pointer -D_LITTLE_ENDIAN -CFLAGS_REQUIRED_i586 += -fno-omit-frame-pointer -D_LITTLE_ENDIAN -CFLAGS_REQUIRED_ia64 += -fno-omit-frame-pointer -D_LITTLE_ENDIAN -CFLAGS_REQUIRED_sparcv9 += -m64 -mcpu=v9 -LDFLAGS_COMMON_sparcv9 += -m64 -mcpu=v9 -CFLAGS_REQUIRED_sparc += -m32 -mcpu=v9 -LDFLAGS_COMMON_sparc += -m32 -mcpu=v9 -ifeq ($(ZERO_BUILD), true) - CFLAGS_REQUIRED = $(ZERO_ARCHFLAG) - ifeq ($(ZERO_ENDIANNESS), little) - CFLAGS_REQUIRED += -D_LITTLE_ENDIAN - endif - LDFLAGS_COMMON += $(ZERO_ARCHFLAG) -else - CFLAGS_REQUIRED = $(CFLAGS_REQUIRED_$(ARCH)) - LDFLAGS_COMMON += $(LDFLAGS_COMMON_$(ARCH)) -endif - -# Add in platform specific optimizations for all opt levels -CC_HIGHEST_OPT += $(_OPT_$(ARCH)) -CC_HIGHER_OPT += $(_OPT_$(ARCH)) -CC_LOWER_OPT += $(_OPT_$(ARCH)) - -# If NO_OPTIMIZATIONS is defined in the environment, turn all optimzations off -ifdef NO_OPTIMIZATIONS - CC_HIGHEST_OPT = $(CC_NO_OPT) - CC_HIGHER_OPT = $(CC_NO_OPT) - CC_LOWER_OPT = $(CC_NO_OPT) -endif - -# -# Selection of warning messages -# -GCC_INHIBIT = -Wno-unused -Wno-parentheses -GCC_STYLE = -GCC_WARNINGS = -W -Wall $(GCC_STYLE) $(GCC_INHIBIT) - -# -# Treat compiler warnings as errors, if warnings not allowed -# -ifeq ($(COMPILER_WARNINGS_FATAL),true) - GCC_WARNINGS += -Werror -endif - -# -# Misc compiler options -# -ifeq ($(ARCH),ppc) - CFLAGS_COMMON = -fsigned-char -else # ARCH - CFLAGS_COMMON = -fno-strict-aliasing -endif # ARCH -PIC_CODE_LARGE = -fPIC -PIC_CODE_SMALL = -fpic -GLOBAL_KPIC = $(PIC_CODE_LARGE) -ifeq ($(ARCH), amd64) - CFLAGS_COMMON += $(GLOBAL_KPIC) $(GCC_WARNINGS) -pipe -else - CFLAGS_COMMON += $(GLOBAL_KPIC) $(GCC_WARNINGS) -endif - -# Linux 64bit machines use Dwarf2, which can be HUGE, have fastdebug use -g1 -DEBUG_FLAG = -g -ifeq ($(FASTDEBUG), true) - ifeq ($(ARCH_DATA_MODEL), 64) - DEBUG_FLAG = -g1 - endif -endif - -CFLAGS_OPT = $(POPT) -CFLAGS_DBG = $(DEBUG_FLAG) -CFLAGS_COMMON += $(CFLAGS_REQUIRED) - -CXXFLAGS_COMMON = $(GLOBAL_KPIC) -DCC_NOEX $(GCC_WARNINGS) -CXXFLAGS_OPT = $(POPT) -CXXFLAGS_DBG = $(DEBUG_FLAG) -CXXFLAGS_COMMON += $(CFLAGS_REQUIRED) - -# FASTDEBUG: Optimize the code in the -g versions, gives us a faster debug java -ifeq ($(FASTDEBUG), true) - CFLAGS_DBG += $(CC_LOWER_OPT) - CXXFLAGS_DBG += $(CC_LOWER_OPT) -endif - -CPP_ARCH_FLAGS = -DARCH='"$(ARCH)"' - -# Alpha arch does not like "alpha" defined (potential general arch cleanup issue here) -ifneq ($(ARCH),alpha) - CPP_ARCH_FLAGS += -D$(ARCH) -else - CPP_ARCH_FLAGS += -D_$(ARCH)_ -endif - -CPPFLAGS_COMMON = $(CPP_ARCH_FLAGS) -DLINUX $(VERSION_DEFINES) \ - -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -D_REENTRANT - -ifeq ($(ARCH_DATA_MODEL), 64) -CPPFLAGS_COMMON += -D_LP64=1 -endif - -CPPFLAGS_OPT = -CPPFLAGS_DBG = -DDEBUG - -ifdef LIBRARY - # Libraries need to locate other libraries at runtime, and you can tell - # a library where to look by way of the dynamic runpaths (RPATH or RUNPATH) - # buried inside the .so. The $ORIGIN says to look relative to where - # the library itself is and it can be followed with relative paths from - # that. By default we always look in $ORIGIN, optionally we add relative - # paths if the Makefile sets LD_RUNPATH_EXTRAS to those relative paths. - # On Linux we add a flag -z origin, not sure if this is necessary, but - # doesn't seem to hurt. - # The environment variable LD_LIBRARY_PATH will over-ride these runpaths. - # Try: 'readelf -d lib*.so' to see these settings in a library. - # - LDFLAGS_COMMON += -Xlinker -z -Xlinker origin -Xlinker -rpath -Xlinker \$$ORIGIN - LDFLAGS_COMMON += $(LD_RUNPATH_EXTRAS:%=-Xlinker -z -Xlinker origin -Xlinker -rpath -Xlinker \$$ORIGIN/%) -endif - -EXTRA_LIBS += -lc - -LDFLAGS_DEFS_OPTION = -Xlinker -z -Xlinker defs -LDFLAGS_COMMON += $(LDFLAGS_DEFS_OPTION) - -# -# -L paths for finding and -ljava -# -LDFLAGS_OPT = -Xlinker -O1 -LDFLAGS_COMMON += -L$(LIBDIR)/$(LIBARCH) -LDFLAGS_COMMON += -Wl,-soname=$(LIB_PREFIX)$(LIBRARY).$(LIBRARY_SUFFIX) - -# -# -static-libgcc is a gcc-3 flag to statically link libgcc, gcc-2.9x always -# statically link libgcc but will print a warning with the flag. We don't -# want the warning, so check gcc version first. -# -CC_VER_MAJOR := $(shell $(CC) -dumpversion | $(SED) 's/egcs-//' | $(CUT) -d'.' -f1) -ifeq ("$(CC_VER_MAJOR)", "3") -OTHER_LDFLAGS += -static-libgcc -endif - -# Automatic precompiled header option to use (if COMPILE_APPROACH=batch) -# (See Rules.gmk) The gcc 5 compiler might have an option for this? -AUTOMATIC_PCH_OPTION = - -# -# Post Processing of libraries/executables -# -ifeq ($(VARIANT), OPT) - ifneq ($(NO_STRIP), true) - # Debug 'strip -g' leaves local function Elf symbols (better stack traces) - POST_STRIP_PROCESS = $(STRIP) -g - endif -endif - -# -# Use: ld $(LD_MAPFILE_FLAG) mapfile *.o -# -LD_MAPFILE_FLAG = -Xlinker --version-script -Xlinker - -# -# Support for Quantify. -# -ifdef QUANTIFY -QUANTIFY_CMD = quantify -QUANTIFY_OPTIONS = -cache-dir=/tmp/quantify -always-use-cache-dir=yes -LINK_PRE_CMD = $(QUANTIFY_CMD) $(QUANTIFY_OPTIONS) -endif - -# -# Path and option to link against the VM, if you have to. Note that -# there are libraries that link against only -ljava, but they do get -# -L to the -ljvm, this is because -ljava depends on -ljvm, whereas -# the library itself should not. -# -VM_NAME = server -JVMLIB = -L$(BOOTDIR)/jre/lib/$(LIBARCH)/$(VM_NAME) -ljvm -JAVALIB = -L$(BOOTDIR)/jre/lib/$(LIBARCH) -ljava $(JVMLIB) - -# -# We want to privatize JVM symbols on Solaris. This is so the user can -# write a function called FindClass and this should not override the -# FindClass that is inside the JVM. At this point in time we are not -# concerned with other JNI libraries because we hope that there will -# not be as many clashes there. -# -PRIVATIZE_JVM_SYMBOLS = false - -USE_PTHREADS = true -override ALT_CODESET_KEY = _NL_CTYPE_CODESET_NAME -override AWT_RUNPATH = -override HAVE_ALTZONE = false -override HAVE_FILIOH = false -override HAVE_GETHRTIME = false -override HAVE_GETHRVTIME = false -override HAVE_SIGIGNORE = true -override LEX_LIBRARY = -lfl -ifeq ($(STATIC_CXX),true) -override LIBCXX = -Wl,-Bstatic -lstdc++ -lgcc -Wl,-Bdynamic -else -override LIBCXX = -lstdc++ -endif -override LIBPOSIX4 = -override LIBSOCKET = -override LIBTHREAD = -override MOOT_PRIORITIES = true -override NO_INTERRUPTIBLE_IO = true -override OPENWIN_HOME = /usr/X11R6 -ifeq ($(ARCH), amd64) -override OPENWIN_LIB = $(OPENWIN_HOME)/lib64 -else -override OPENWIN_LIB = $(OPENWIN_HOME)/lib -endif -override OTHER_M4FLAGS = -D__GLIBC__ -DGNU_ASSEMBLER -override SUN_CMM_SUBDIR = -override THREADS_FLAG = native -override USE_GNU_M4 = true -override USING_GNU_TAR = true -override WRITE_LIBVERSION = false - -# USE_EXECNAME forces the launcher to look up argv[0] on $PATH, and put the -# resulting resolved absolute name of the executable in the environment -# variable EXECNAME. That executable name is then used that to locate the -# installation area. -override USE_EXECNAME = true - -# If your platform has DPS, it will have Type1 fonts too, in which case -# it is best to enable DPS support until such time as 2D's rasteriser -# can fully handle Type1 fonts in all cases. Default is "yes". -# HAVE_DPS should only be "no" if the platform has no DPS headers or libs -# DPS (Displayable PostScript) is available on Solaris machines -HAVE_DPS = no - -# -# Japanese manpages -# -JA_SOURCE_ENCODING = eucJP -JA_TARGET_ENCODINGS = eucJP - diff --git a/corba/make/common/Defs-solaris.gmk b/corba/make/common/Defs-solaris.gmk index d7c5a42362c..eb38771dfab 100644 --- a/corba/make/common/Defs-solaris.gmk +++ b/corba/make/common/Defs-solaris.gmk @@ -28,16 +28,6 @@ # targeted to Solaris. Should not contain any rules. # -# Warning: the following variables are overridden by Defs.gmk. Set -# values will be silently ignored: -# CFLAGS (set $(OTHER_CFLAGS) instead) -# CPPFLAGS (set $(OTHER_CPPFLAGS) instead) -# CXXFLAGS (set $(OTHER_CXXFLAGS) instead) -# LDFLAGS (set $(OTHER_LDFAGS) instead) -# LDLIBS (set $(EXTRA_LIBS) instead) -# LDLIBS_COMMON (set $(EXTRA_LIBS) instead) -# LINTFLAGS (set $(OTHER_LINTFLAGS) instead) - # Get shared JDK settings include $(BUILDDIR)/common/shared/Defs.gmk @@ -45,600 +35,3 @@ ifndef PLATFORM_SRC PLATFORM_SRC = $(TOPDIR)/src/solaris endif # PLATFORM_SRC -# platform specific include files -PLATFORM_INCLUDE_NAME = $(PLATFORM) -PLATFORM_INCLUDE = $(INCLUDEDIR)/$(PLATFORM_INCLUDE_NAME) - -# suffix used for make dependencies files -DEPEND_SUFFIX = d -# suffix used for lint files -LINT_SUFFIX = ln -# The suffix applied to the library name for FDLIBM -FDDLIBM_SUFFIX = a -# The suffix applied to scripts (.bat for windows, nothing for unix) -SCRIPT_SUFFIX = -# CC compiler object code output directive flag value -CC_OBJECT_OUTPUT_FLAG = -o #trailing blank required! -CC_PROGRAM_OUTPUT_FLAG = -o #trailing blank required! - -# -# Default HPI libraries. Build will build only native unless -# overriden at the make command line. This makes it convenient for -# people doing, say, a pthreads port -- they can create a posix -# directory here, and say "gnumake HPIS=posix" at the top -# level. -# -HPIS = native - -# -# Java default optimization (-x04/-O2) etc. Applies to the VM. -# -ifeq ($(PRODUCT), java) - _OPT = $(CC_HIGHER_OPT) -else - _OPT = $(CC_LOWER_OPT) - CPPFLAGS_DBG += -DLOGGING -DDBINFO -endif - -# -# If -Xa is in CFLAGS_COMMON it will end up ahead of $(POPT) for the -# optimized build, and that ordering of the flags completely freaks -# out cc. Hence, -Xa is instead in each CFLAGS variant. -# -# The more unusual options to the Sun C compiler: -# -v Stricter type checking, more error checking -# (To turn ALL warnings into fatals, use -errwarn=%all) -# -xstrconst Place string literals and constants in read-only area -# (means you can't write on your string literals) -# -xs Force debug information (stabs) into the .so or a.out -# (makes the library/executable debuggable without the -# .o files needing to be around, but at a space cost) -# -g & -O If you add the -g option to the optimized compiles -# you will get better stack retraces, the code is -# still optimized. This includes a space cost too. -# -xc99=%none Do NOT allow for c99 extensions to be used. -# e.g. declarations must precede statements -# -xCC Allow the C++ style of comments in C: // -# Required with many of the source files. -# -mt Assume multi-threaded (important) -# - -# -# Debug flag for C and C++ compiler -# -CFLAGS_DEBUG_OPTION=-g -CXXFLAGS_DEBUG_OPTION=-g - -# Turn off -g if we are doing tcov build -ifdef TCOV_BUILD - CFLAGS_DEBUG_OPTION= - CXXFLAGS_DEBUG_OPTION= -endif - -# FASTDEBUG: Optimize the -g builds, gives us a faster debug java -# If true adds -O to the debug compiles. This allows for any assert -# tests to remain and debug checking. The resulting code is faster -# but less debuggable. Stack traces are still valid, although only -# approximate line numbers are given. Printing of local variables -# during a debugging session is not possible, but stepping and -# printing of global or static variables should be possible. -# Performance/size of files should be about the same, maybe smaller. -# -ifeq ($(FASTDEBUG), true) - CC_FASTDEBUG_OPT = $(CC_LOWER_OPT) - CFLAGS_DEBUG_OPTION = -g $(CC_FASTDEBUG_OPT) - CXXFLAGS_DEBUG_OPTION = -g0 $(CC_FASTDEBUG_OPT) -endif - -CFLAGS_COMMON = -v -mt -L$(OBJDIR) -xc99=%none -CFLAGS_COMMON += -xCC -CFLAGS_COMMON += -errshort=tags -CFLAGS_OPT = $(POPT) -CFLAGS_DBG = $(CFLAGS_DEBUG_OPTION) -CFLAGS_COMMON += -Xa $(CFLAGS_REQUIRED) - -# Assume MT behavior all the time (important) -CXXFLAGS_COMMON = -mt - -# Assume no C++ exceptions are used -CXXFLAGS_COMMON += -features=no%except -DCC_NOEX - -# For C++, these options tell it to assume nothing about locating libraries -# either at compile time, or at runtime. Use of these options will likely -# require the use of -L and -R options to indicate where libraries will -# be found at compile time (-L) and at runtime (-R). -# The /usr/lib location comes for free, so no need to specify that one. -# Note: C is much simplier and there is no need for these options. This -# is mostly needed to avoid dependencies on libraries in the -# Compiler install area, also see LIBCXX and LIBM. -CXXFLAGS_COMMON += -norunpath -xnolib - -# -# Treat compiler warnings as errors, if requested -# -ifeq ($(COMPILER_WARNINGS_FATAL),true) - CFLAGS_COMMON += -errwarn=%all - CXXFLAGS_COMMON += -errwarn=%all -endif - -CXXFLAGS_OPT = $(POPT) -CXXFLAGS_DBG = $(CXXFLAGS_DEBUG_OPTION) -CXXFLAGS_COMMON += $(CFLAGS_REQUIRED) - -# Add -xstrconst to the library compiles. This forces all string -# literals into the read-only data section, which prevents them from -# being written to and increases the runtime pages shared on the system. -# -ifdef LIBRARY - CFLAGS_COMMON +=-xstrconst -endif - -# Source browser database -# -# COMPILE_WITH_SB -# If defined adds -xsb to compiles and creates a -# source browsing database during compilation. -# -ifdef COMPILE_WITH_SB - ifeq ($(LIBRARY), java) - CFLAGS_DBG += -xsb - endif -endif - -# Lint Flags: -# -Xa ANSI C plus K&R, favor ANSI rules -# -Xarch=XXX Same as 'cc -xarch=XXX' -# -fd report on old style func defs -# -errchk=structarg report on 64bit struct args by value -# -errchk=longptr64 report on 64bit to 32bit issues (ignores casts) -# -errchk=parentheses report on suggested use of extra parens -# -v suppress unused args -# -x suppress unused externs -# -u suppress extern func/vars used/defined -# -errfmt=simple use one line errors with position info - -LINTFLAGS_COMMON = -Xa -LINTFLAGS_COMMON += -fd -LINTFLAGS_COMMON += -errchk=structarg,longptr64,parentheses -LINTFLAGS_COMMON += -v -LINTFLAGS_COMMON += -x -LINTFLAGS_COMMON += -u -LINTFLAGS_COMMON += -errfmt=simple -LINTFLAGS_OPT = -LINTFLAGS_DBG = - -# The -W0,-noglobal tells the compiler to NOT generate mangled global -# ELF data symbols for file local static data. -# This can break fix&continue, but we'd rather do the same compilations -# for deliverable bits as we do for non-deliverable bits -# Tell the compilers to never generate globalized names, all the time. -CFLAGS_COMMON += -W0,-noglobal - -# Arch specific settings (determines type of .o files and instruction set) -ifeq ($(ARCH_FAMILY), sparc) - ifdef VIS_NEEDED - XARCH_VALUE/32=v8plusa - XARCH_VALUE/64=v9a - else - # Someday this should change to improve optimization on UltraSPARC - # and abandon the old v8-only machines like the SPARCstation 10. - # Indications with Mustang is that alacrity runs do not show a - # big improvement using v8plus over v8, but other benchmarks might. - XARCH_VALUE/32=v8 - XARCH_VALUE/64=v9 - endif -endif -ifeq ($(ARCH_FAMILY), i586) - XARCH_VALUE/64=amd64 - XARCH_VALUE/32= -endif - -# Arch value based on current data model being built -XARCH_VALUE=$(XARCH_VALUE/$(ARCH_DATA_MODEL)) -ifneq ($(XARCH_VALUE), ) - # The actual compiler -xarch options to use - XARCH_OPTION/32 = -xarch=$(XARCH_VALUE/32) - XARCH_OPTION/64 = -xarch=$(XARCH_VALUE/64) - XARCH_OPTION = $(XARCH_OPTION/$(ARCH_DATA_MODEL)) -endif - -# If we have a specific -xarch value to use, add it -ifdef XARCH_OPTION - CFLAGS_COMMON += $(XARCH_OPTION) - CXXFLAGS_COMMON += $(XARCH_OPTION) - ASFLAGS_COMMON += $(XARCH_OPTION) - EXTRA_LIBS += $(XARCH_OPTION) - LINTFLAGS_COMMON += -Xarch=$(XARCH_VALUE) -endif - -# -# uncomment the following to build with PERTURBALOT set -# -# OTHER_CFLAGS += -DPERTURBALOT -# - -CPPFLAGS_COMMON = -D$(ARCH_FAMILY) -D__solaris__ -D_REENTRANT -CPPFLAGS_OPT = -CPPFLAGS_DBG = -DDEBUG - -ifeq ($(ARCH_FAMILY), i586) - # The macro _LITTLE_ENDIAN needs to be defined the same to avoid the - # Sun C compiler warning message: warning: macro redefined: _LITTLE_ENDIAN - # (The Solaris X86 system defines this in file /usr/include/sys/isa_defs.h). - # Note: -Dmacro is the same as #define macro 1 - # -Dmacro= is the same as #define macro - # - CPPFLAGS_COMMON += -DcpuIntel -D_LITTLE_ENDIAN= -D$(LIBARCH) - # Turn off a superfluous compiler error message on Intel - CFLAGS_COMMON += -erroff=E_BAD_PRAGMA_PACK_VALUE -endif - -# Java memory management is based on memory mapping by default, but a -# system only assuming malloc/free can be built by adding -DUSE_MALLOC - -CPPFLAGS_COMMON += -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS -CPPFLAGS_OPT += -DTRIMMED - -LDFLAGS_DEFS_OPTION = -z defs -LDFLAGS_COMMON += $(LDFLAGS_DEFS_OPTION) - -# -# -L paths for finding and -ljava -# -LDFLAGS_COMMON += -L$(LIBDIR)/$(LIBARCH) -LDFLAGS_OPT = -LDFLAGS_DBG = - -# -# We never really want the incremental linker, ever -# The -xildoff option tells Sun's compilers to NOT use incremental linker -# -LDFLAGS_COMMON += -xildoff - -ifdef LIBRARY - # Libraries need to locate other libraries at runtime, and you can tell - # a library where to look by way of the dynamic runpaths (RPATH or RUNPATH) - # buried inside the .so. The $ORIGIN says to look relative to where - # the library itself is and it can be followed with relative paths from - # that. By default we always look in $ORIGIN, optionally we add relative - # paths if the Makefile sets LD_RUNPATH_EXTRAS to those relative paths. - # The environment variable LD_LIBRARY_PATH will over-ride these runpaths. - # Try: 'dump -Lv lib*.so' to see these settings in a library. - # - LDFLAGS_COMMON += -R\$$ORIGIN - LDFLAGS_COMMON += $(LD_RUNPATH_EXTRAS:%=-R\$$ORIGIN/%) -endif - -EXTRA_LIBS += -lc - -# Postprocessing is done on the images directories only -# -ifeq ($(VARIANT), OPT) - ifeq ($(PARTIAL_GPROF), true) - NO_STRIP = true - endif - ifeq ($(GPROF), true) - NO_STRIP = true - endif - ifneq ($(NO_STRIP), true) - # Debug 'strip -x' leaves local function Elf symbols (better stack traces) - POST_STRIP_PROCESS = $(STRIP) -x - endif -endif -POST_MCS_PROCESS=$(MCS) -d -a "JDK $(FULL_VERSION)" - -# -# Sun C compiler will take -M and pass it on to ld. -# Usage: ld $(LD_MAPFILE_FLAG) mapfile *.o -# -ifeq ($(CC_VERSION),gcc) -LD_MAPFILE_FLAG = -Xlinker -M -Xlinker -else -LD_MAPFILE_FLAG = -M -endif - -# -# Variables globally settable from the make command line (default -# values in brackets): -# GPROF (false) -# Eg: % gnumake GPROF=true -GPROF = false -ifeq ($(GPROF), true) - CFLAGS_COMMON += -DGPROF -xpg - EXTRA_LIBS += -xpg -endif - -# PARTIAL_GPROF is to be used ONLY during compilation - it should not -# appear during linking of libraries or programs. It also should -# prevent linking with -z defs to allow a symbol to remain undefined. -# -PARTIAL_GPROF = false -ifeq ($(PARTIAL_GPROF), true) - CFLAGS_GPROF += -xpg - LDFLAGS_DEFS_OPTION = -z nodefs -endif - -# -# For a TCOV build we add in the TCOV_OPTION -# -ifdef TCOV_BUILD - TCOV_OPTION = -xprofile=tcov - LDFLAGS_COMMON += $(TCOV_OPTION) -Kpic - CFLAGS_COMMON += $(TCOV_OPTION) - CXXFLAGS_COMMON += $(TCOV_OPTION) - EXTRA_LIBS += $(TCOV_OPTION) - LDNOMAP=true -endif - -# -# Solaris only uses native threads. -# -THREADS_FLAG= native -THREADS_DIR= threads - -# -# Support for Quantify. -# -ifdef QUANTIFY - QUANTIFY_CMD = quantify - QUANTIFY_OPTIONS = -cache-dir=/tmp/quantify -always-use-cache-dir=yes - LINK_PRE_CMD = $(QUANTIFY_CMD) $(QUANTIFY_OPTIONS) - ifdef LIBRARY - CFLAGS_COMMON += -K PIC - endif -endif - -# -# Support for Purify. -# -ifdef PURIFY - PURIFY_CMD = /net/suntools.eng/export/tools/sparc/bin/purify - PURIFY_OPTIONS = -cache-dir=/tmp/quantify -always-use-cache-dir=yes - LINK_PRE_CMD = $(PURIFY_CMD) $(PURIFY_OPTIONS) - ifdef LIBRARY - CFLAGS_COMMON += -K PIC - endif -endif - -# -# Different "levels" of optimization. -# -ifeq ($(CC_VERSION),gcc) - CC_HIGHEST_OPT = -O3 - CC_HIGHER_OPT = -O3 - CC_LOWER_OPT = -O2 - CFLAGS_REQUIRED_i586 += -fno-omit-frame-pointer - CFLAGS_REQUIRED_amd64 += -fno-omit-frame-pointer - # Automatic precompiled header option to use (if COMPILE_APPROACH=batch) - # (See Rules.gmk) May need to wait for gcc 5? - AUTOMATIC_PCH_OPTION = -else - # Highest could be -xO5, but indications are that -xO5 should be reserved - # for a per-file use, on sources with known performance impacts. - CC_HIGHEST_OPT = -xO4 - CC_HIGHER_OPT = -xO4 - CC_LOWER_OPT = -xO2 - # - # WARNING: Use of _OPT=$(CC_HIGHEST_OPT) in your Makefile needs to be - # done with care, there are some assumptions below that need to - # be understood about the use of pointers, and IEEE behavior. - # - # Use non-standard floating point mode (not IEEE 754) - CC_HIGHEST_OPT += -fns - # Do some simplification of floating point arithmetic (not IEEE 754) - CC_HIGHEST_OPT += -fsimple - # Use single precision floating point with 'float' - CC_HIGHEST_OPT += -fsingle - # Assume memory references via basic pointer types do not alias - # (Source with excessing pointer casting and data access with mixed - # pointer types are not recommended) - CC_HIGHEST_OPT += -xalias_level=basic - # Use intrinsic or inline versions for math/std functions - # (If you expect perfect errno behavior, do not use this) - CC_HIGHEST_OPT += -xbuiltin=%all - # Loop data dependency optimizations (need -xO3 or higher) - CC_HIGHEST_OPT += -xdepend - # Pointer parameters to functions do not overlap - # (Similar to -xalias_level=basic usage, but less obvious sometimes. - # If you pass in multiple pointers to the same data, do not use this) - CC_HIGHEST_OPT += -xrestrict - # Inline some library routines - # (If you expect perfect errno behavior, do not use this) - CC_HIGHEST_OPT += -xlibmil - # Use optimized math routines - # (If you expect perfect errno behavior, do not use this) - # Can cause undefined external on Solaris 8 X86 on __sincos, removing for now - # CC_HIGHEST_OPT += -xlibmopt - ifeq ($(ARCH_FAMILY), sparc) - # Assume at most 8byte alignment, raise SIGBUS on error - ### Presents an ABI issue with customer JNI libs? - ####CC_HIGHEST_OPT += -xmemalign=8s - # Automatic prefetch instructions, explicit prefetch macros - CC_HIGHEST_OPT += -xprefetch=auto,explicit - # Pick ultra as the chip to optimize to - CC_HIGHEST_OPT += -xchip=ultra - endif - ifeq ($(ARCH), i586) - # Pick pentium as the chip to optimize to - CC_HIGHEST_OPT += -xchip=pentium - endif - ifdef LIBRARY - # The Solaris CBE (Common Build Environment) requires that the use - # of appl registers be disabled when compiling a public library (or - # a library that's loaded by a public library) on sparc. - CFLAGS_REQUIRED_sparc += -xregs=no%appl - CFLAGS_REQUIRED_sparcv9 += -xregs=no%appl - endif - ifeq ($(shell $(EXPR) $(CC_VER) \> 5.6), 1) - # Do NOT use the frame pointer register as a general purpose opt register - CFLAGS_REQUIRED_i586 += -xregs=no%frameptr - CFLAGS_REQUIRED_amd64 += -xregs=no%frameptr - # We MUST allow data alignment of 4 for sparc V8 (32bit) - # Presents an ABI issue with customer JNI libs? We must be able to - # to handle 4byte aligned objects? (rare occurance, but possible?) - CFLAGS_REQUIRED_sparc += -xmemalign=4s - endif - # Just incase someone trys to use the SOS9 compilers - ifeq ($(CC_VER), 5.6) - # We MUST allow data alignment of 4 for sparc (sparcv9 is ok at 8s) - CFLAGS_REQUIRED_sparc += -xmemalign=4s - endif - # Automatic precompiled header option to use (if COMPILE_APPROACH=batch) - # (See Rules.gmk) The SS11 -xpch=auto* options appear to be broken. - AUTOMATIC_PCH_OPTION = -endif -CC_NO_OPT = - -# If NO_OPTIMIZATIONS is defined in the environment, turn all optimzations off -ifdef NO_OPTIMIZATIONS - CC_HIGHEST_OPT = $(CC_NO_OPT) - CC_HIGHER_OPT = $(CC_NO_OPT) - CC_LOWER_OPT = $(CC_NO_OPT) -endif - -# Flags required all the time -CFLAGS_REQUIRED = $(CFLAGS_REQUIRED_$(ARCH)) - -# Add processor specific options for optimizations -CC_HIGHEST_OPT += $(_OPT_$(ARCH)) -CC_HIGHER_OPT += $(_OPT_$(ARCH)) -CC_LOWER_OPT += $(_OPT_$(ARCH)) - -# Secret compiler optimization options that should be in the above macros -# but since they differ in format from C to C++, are added into the C or -# C++ specific macros for compiler flags. -# -# On i586 we need to tell the code generator to ALWAYS use a -# frame pointer. -ifeq ($(ARCH_FAMILY), i586) - # Note that in 5.7, this is done with -xregs=no%frameptr - ifeq ($(CC_VER), 5.5) - # It's not exactly clear when this optimization kicks in, the - # current assumption is -xO4 or greater and for C++ with - # the -features=no%except option and -xO4 and greater. - # Bottom line is, we ALWAYS want a frame pointer! - CXXFLAGS_OPT += -Qoption ube -Z~B - CFLAGS_OPT += -Wu,-Z~B - ifeq ($(FASTDEBUG), true) - CXXFLAGS_DBG += -Qoption ube -Z~B - CFLAGS_DBG += -Wu,-Z~B - endif - endif -endif -# -# Optimizer for sparc needs to be told not to do certain things -# related to frames or save instructions. -ifeq ($(ARCH_FAMILY), sparc) - # NOTE: Someday the compilers will provide a high-level option for this. - # Use save instructions instead of add instructions - # This was an optimization starting in SC5.0 that made it hard for us to - # find the "save" instruction (which got turned into an "add") - CXXFLAGS_OPT += -Qoption cg -Qrm-s - CFLAGS_OPT += -Wc,-Qrm-s - ifeq ($(FASTDEBUG), true) - CXXFLAGS_DBG += -Qoption cg -Qrm-s - CFLAGS_DBG += -Wc,-Qrm-s - endif - # - # NOTE: Someday the compilers will provide a high-level option for this. - # Don't allow tail call code optimization. Started in SC5.0. - # We don't like code of this form: - # save - # - # call foo - # restore - # because we can't tell if the method will have a stack frame - # and register windows or not. - CXXFLAGS_OPT += -Qoption cg -Qiselect-T0 - CFLAGS_OPT += -Wc,-Qiselect-T0 - ifeq ($(FASTDEBUG), true) - CXXFLAGS_DBG += -Qoption cg -Qiselect-T0 - CFLAGS_DBG += -Wc,-Qiselect-T0 - endif -endif - -# -# Path and option to link against the VM, if you have to. Note that -# there are libraries that link against only -ljava, but they do get -# -L to the -ljvm, this is because -ljava depends on -ljvm, whereas -# the library itself should not. -# -VM_NAME = server -JVMLIB = -L$(BOOTDIR)/jre/lib/$(LIBARCH)/server -ljvm -JAVALIB = - -# Part of INCREMENTAL_BUILD mechanism. -# Compiler emits things like: path/file.o: file.h -# We want something like: relative_path/file.o relative_path/file.d: file.h -# In addition on Solaris, any include file starting with / is deleted, -# this gets rid of things like /usr/include files, which never change. -CC_DEPEND = -xM1 -CC_DEPEND_FILTER = $(SED) -e '/:[ ]*[/]/d' -e 's!$*\.$(OBJECT_SUFFIX)!$(dir $@)& $(dir $@)$*.$(DEPEND_SUFFIX)!g' | $(SORT) -u - -# Location of openwin libraries (do we really need this anymore?) -OPENWIN_HOME = /usr/openwin -OPENWIN_LIB = $(OPENWIN_HOME)/lib$(ISA_DIR) - -# Runtime graphics library search paths... -OPENWIN_RUNTIME_LIB = /usr/openwin/lib$(ISA_DIR) -AWT_RUNPATH = -R/usr/dt/lib$(ISA_DIR) -R$(OPENWIN_RUNTIME_LIB) - -# C++ Runtime library (libCrun.so), use instead of -lCrun. -# Originally used instead of -lCrun to guarantee use of the system -# .so version and not the .a or .so that came with the compilers. -# With the newer compilers this could probably change back to -lCrun but -# in general this is ok to continue to do. -LIBCXX = /usr/lib$(ISA_DIR)/libCrun.so.1 - -# Math Library (libm.so), do not use -lm. -# There might be two versions of libm.so on the build system: -# libm.so.1 and libm.so.2, and we want libm.so.1. -# Depending on the Solaris release being used to build with, -# /usr/lib/libm.so could point at a libm.so.2, so we are -# explicit here so that the libjvm.so you have built will work on an -# older Solaris release that might not have libm.so.2. -# This is a critical factor in allowing builds on Solaris 10 or newer -# to run on Solaris 8 or 9. -# -# Note: Historically there was also a problem picking up a static version -# of libm.a from the compiler area, but that problem has gone away -# with the newer compilers. Use of libm.a would cause .so bloat. -# -LIBM = /usr/lib$(ISA_DIR)/libm.so.1 - -# Socket library -LIBSOCKET = -lsocket - -# GLOBAL_KPIC: If set means all libraries are PIC, position independent code -# EXCEPT for select compiles -# If a .o file is compiled non-PIC then it should be forced -# into the RW data segment with a mapfile option. This is done -# with object files which generated from .s files. -# The -ztext enforces that no relocations remain in the text segment -# so that it remains purely read-only for optimum system performance. -# Some libraries may use a smaller size (13bit -Kpic) on sparc instead of -# (32 bit -KPIC) and will override GLOBAL_KPIC appropriately. -# -PIC_CODE_LARGE = -KPIC -PIC_CODE_SMALL = -Kpic -ifndef TCOV_BUILD - GLOBAL_KPIC = $(PIC_CODE_LARGE) - CXXFLAGS_COMMON += $(GLOBAL_KPIC) - CFLAGS_COMMON += $(GLOBAL_KPIC) - LDFLAGS_COMMON += -ztext -endif # TCOV_BUILD - -# If your platform has DPS, it will have Type1 fonts too, in which case -# it is best to enable DPS support until such time as 2D's rasteriser -# can fully handle Type1 fonts in all cases. Default is "yes". -# HAVE_DPS should only be "no" if the platform has no DPS headers or libs -# DPS (Displayable PostScript) is available on Solaris machines - -HAVE_DPS = yes - -# -# Japanese manpages -# -JA_SOURCE_ENCODING = eucJP -JA_TARGET_ENCODINGS = eucJP UTF-8 PCK - diff --git a/corba/make/common/Defs-windows.gmk b/corba/make/common/Defs-windows.gmk index 7dc24d975da..cef6c6c60b8 100644 --- a/corba/make/common/Defs-windows.gmk +++ b/corba/make/common/Defs-windows.gmk @@ -31,363 +31,7 @@ # Get shared JDK settings include $(BUILDDIR)/common/shared/Defs.gmk -# CC compiler object code output directive flag value -CC_OBJECT_OUTPUT_FLAG = -Fo -CC_PROGRAM_OUTPUT_FLAG = -Fe - -# The suffix applied to the library name for FDLIBM -FDDLIBM_SUFFIX = lib -# The suffix applied to scripts (.bat for windows, nothing for unix) -SCRIPT_SUFFIX = .bat - -HPIS = windows -# LIB_LOCATION, which for windows identifies where .exe files go, may be -# set by each GNUmakefile. The default is BINDIR. -ifndef LIB_LOCATION - LIB_LOCATION = $(BINDIR) -endif # LIB_LOCATION - ifndef PLATFORM_SRC PLATFORM_SRC = $(TOPDIR)/src/windows endif # PLATFORM_SRC -# for backwards compatability, the old "win32" is used here instead of -# the more proper "windows" -PLATFORM_INCLUDE_NAME = win32 -PLATFORM_INCLUDE = $(INCLUDEDIR)/$(PLATFORM_INCLUDE_NAME) - -# The following DLL's are considered MS runtime libraries and should -# not to be REBASEd, see deploy/make/common/Release.gmk. -# msvcrt.dll, msvcrnn.dll [msvcr71 or msvcr80 or msvcr90] : Microsoft runtimes -MS_RUNTIME_LIBRARIES = msvcrt.dll -MSVCRNN_DLL = -ifeq ($(ARCH_DATA_MODEL), 32) - ifeq ($(COMPILER_VERSION), VS2003) - MSVCRNN_DLL = msvcr71.dll - MSVCPNN_DLL = msvcp71.dll - MS_RUNTIME_LIBRARIES += $(MSVCRNN_DLL) - endif - ifeq ($(COMPILER_VERSION), VS2005) - MSVCRNN_DLL = msvcr80.dll - MSVCPNN_DLL = msvcp80.dll - MS_RUNTIME_LIBRARIES += $(MSVCRNN_DLL) - endif - ifeq ($(COMPILER_VERSION), VS2008) - MSVCRNN_DLL = msvcr90.dll - MSVCPNN_DLL = msvcp90.dll - MS_RUNTIME_LIBRARIES += $(MSVCRNN_DLL) - endif - ifeq ($(COMPILER_VERSION), VS2010) - MSVCRNN_DLL = msvcr100.dll - MSVCPNN_DLL = msvcp100.dll - MS_RUNTIME_LIBRARIES += $(MSVCRNN_DLL) - endif -endif - -# C Compiler flag definitions - -# -# Default optimization -# -ifeq ($(CC_VERSION),msvc) - # Visual Studio .NET 2003 or VS2003 compiler option definitions: - # -O1 Favors reduced size over speed (-Og -Os -Oy -Ob2 -Gs -GF -Gy) - # -O2 Favors speed over reduced size (-Og -Oi -Ot -Oy -Ob2 -Gs -GF -Gy) - # -Ox Full optimization (use -O2) (-Og -Oi -Ot -Oy -Ob2) - # (Removed in Visual Studio 2005 or VS2005) - # -Ob2 More aggressive inlining - # -Og Global optimizations - # -Oi Replace some functions with intrinsic or special forms - # -Op Improve floating point calculations (disables some optimizations) - # (Replaced with -fp:precise in VS2005, /Op is default now) - # -Os Favor small code - # -Ot Favor faster code - # -Oy Frame pointer omission - # -GB Optimize for pentium (old VC6 option?) - # -G6 VS2003 version of -GB? - # -GF Pool strings in read-only memory - # -Gf Pool strings in read-write memory (the default) - # -Gs Controls stack probess - # -GS Adds buffer overflow checks on stacks - # (Default in VS2005) - # -GX Enables exception handling - # (Replaced with /EHsc in VS2005) - # -Gy Function level linking only - # - # NOTE: With VC6, -Ox included -Gs. - # NOTE: With VC6, -Ox, -O1, and -O2 used -Ob1, not -Ob2. - # NOTE: With VC6, -O1 and -O2 used -Gf, not -GF. - # - ifeq ($(COMPILER_VERSION), VC6) - # VC6 (6.2) msvc compiler (the way Tiger and early Mustang were built) - # Automatic precompiled header option to use (if COMPILE_APPROACH=batch) - AUTOMATIC_PCH_OPTION = - GX_OPTION = -GX - ifeq ($(ARCH_DATA_MODEL), 32) - CC_HIGHEST_OPT = -Ox -Gy -Os -GB - CC_HIGHER_OPT = -Ox -Gy -Os -GB - CC_LOWER_OPT = -Ox -Gy -Os -GB - else - CC_HIGHEST_OPT = -Ox -Gy -Op - CC_HIGHER_OPT = -Ox -Gy -Op - CC_LOWER_OPT = -Ox -Gy -Op - endif - endif - ifeq ($(COMPILER_VERSION), VS2003) - # Automatic precompiled header option to use (if COMPILE_APPROACH=batch) - AUTOMATIC_PCH_OPTION = -YX - # Also known as VC7 compiler - GX_OPTION = -GX - ifeq ($(ARCH_DATA_MODEL), 32) - # Lowered opt level to try and reduce footprint, dll size especially. - # Was: CC_HIGHEST_OPT = -O2 -G6 - # Was: CC_HIGHER_OPT = -O2 - CC_HIGHEST_OPT = -O2 - CC_HIGHER_OPT = -O1 - CC_LOWER_OPT = -O1 - else - CC_HIGHEST_OPT = -O2 -Op - CC_HIGHER_OPT = -O2 -Op - CC_LOWER_OPT = -O1 -Op - endif - endif - ifeq ($(COMPILER_VERSION), VS2005) - # Automatic precompiled header option to use (if COMPILE_APPROACH=batch) - AUTOMATIC_PCH_OPTION = - # VS2005 compiler, only with Platform SDK right now? - GX_OPTION = -EHsc - ifeq ($(ARCH_DATA_MODEL), 32) - CC_HIGHEST_OPT = -O2 - CC_HIGHER_OPT = -O1 - CC_LOWER_OPT = -O1 - else - CC_HIGHEST_OPT = -O2 - CC_HIGHER_OPT = -O1 - CC_LOWER_OPT = -O1 - endif - endif - ifeq ($(COMPILER_VERSION), VS2008) - # Automatic precompiled header option to use (if COMPILE_APPROACH=batch) - AUTOMATIC_PCH_OPTION = - GX_OPTION = -EHsc - ifeq ($(ARCH_DATA_MODEL), 32) - CC_HIGHEST_OPT = -O2 - CC_HIGHER_OPT = -O1 - CC_LOWER_OPT = -O1 - else - CC_HIGHEST_OPT = -O2 - CC_HIGHER_OPT = -O1 - CC_LOWER_OPT = -O1 - endif - endif - ifeq ($(COMPILER_VERSION), VS2010) - # Automatic precompiled header option to use (if COMPILE_APPROACH=batch) - AUTOMATIC_PCH_OPTION = - GX_OPTION = -EHsc - ifeq ($(ARCH_DATA_MODEL), 32) - CC_HIGHEST_OPT = -O2 - CC_HIGHER_OPT = -O1 - CC_LOWER_OPT = -O1 - else - CC_HIGHEST_OPT = -O2 - CC_HIGHER_OPT = -O1 - CC_LOWER_OPT = -O1 - endif - endif - CC_NO_OPT = -Od -else # CC_VERSION - # GCC not supported, but left for historical reference... - CC_HIGHEST_OPT = -O3 - CC_HIGHER_OPT = -O2 - CC_LOWER_OPT = -O2 - CC_NO_OPT = -endif - -# If NO_OPTIMIZATIONS is defined in the environment, turn all optimzations off -ifdef NO_OPTIMIZATIONS - CC_HIGHEST_OPT = $(CC_NO_OPT) - CC_HIGHER_OPT = $(CC_NO_OPT) - CC_LOWER_OPT = $(CC_NO_OPT) -endif - -ifeq ($(PRODUCT), java) - _OPT = $(CC_HIGHER_OPT) -else - _OPT = $(CC_LOWER_OPT) -endif - -# Select the runtime support library carefully, need to be consistent -# -# VS2003 compiler option definitions: -# -MD Use dynamic multi-threaded runtime library -# -MDd Use debug version (don't use, doesn't mix with -MD DLL's) -# -MT Use static multi-threaded runtime library (-ML is going away) -# -MTd Use static debug version (better than -MDd, no runtime issues) -# -D_DEBUG Change use of malloc/free/etc to use special debug ones (-MTd) -# -# NOTE: We also will use /D _STATIC_CPPLIB so we don't need msvcpnn.dll -# -ifeq ($(MS_RUNTIME_STATIC),true) - MS_RUNTIME_OPTION=-MT -else - MS_RUNTIME_OPTION=-MD -endif -# The _DEBUG macro option (changes things like malloc to use debug version) -MS_RUNTIME_DEBUG_OPTION= -MS_RC_DEBUG_OPTION= -# Externally set environment variable can force any build to use the debug vers -ifeq ($(MFC_DEBUG), true) - ifeq ($(MS_RUNTIME_STATIC),true) - MS_RUNTIME_OPTION=-MTd - else - # This MS debugging flag forces a dependence on the debug - # version of the runtime library (MSVCRTD.DLL), as does -MDd. - # We cannot re-distribute this debug runtime. - MS_RUNTIME_OPTION=-MDd - endif - MS_RUNTIME_DEBUG_OPTION= -D_DEBUG - MS_RC_DEBUG_OPTION= -d _DEBUG -endif - -# Always add _STATIC_CPPLIB definition -STATIC_CPPLIB_OPTION = /D _STATIC_CPPLIB -MS_RUNTIME_OPTION += $(STATIC_CPPLIB_OPTION) - -ifeq ($(CC_VERSION),msvc) - # VS2003 compiler option definitions: - # -Zi Cause *.pdb file to be created, full debug information - # -Z7 Full debug inside the .obj, no .pdb - # -Zd Basic debug, no local variables? In the .obj - # -Zl Don't add runtime library name to obj file? - # -Od Turns off optimization and speeds compilation - # -YX -Fp/.../foobar.pch Use precompiled headers (try someday?) - # -nologo Don't print out startup message - # /D _STATIC_CPPLIB - # Use static link for the C++ runtime (so msvcpnn.dll not needed) - # - CFLAGS_COMMON += -Zi -nologo - CFLAGS_OPT = $(POPT) - CFLAGS_DBG = -Od $(MS_RUNTIME_DEBUG_OPTION) - - # Starting from VS2005 the wchar_t is handled as a built-in C/C++ data type - # by default. However, we expect the wchar_t to be a typedef to the - # unsigned short data type. The -Zc:wchar_t- option restores the old - # behavior (as seen in VS2003) to avoid massive code modifications. - # When/if our code will be "C/C++ Standard"-compliant (at least in the area - # of handling the wchar_t type), the option won't be necessary. - ifeq ($(ARCH_DATA_MODEL), 32) - CFLAGS_VS2005 += -Zc:wchar_t- - else - # The 64bit Platform SDK we use (April 2005) doesn't like this option - ifneq ($(CC_VER), 14.00.40310.41) - CFLAGS_VS2005 += -Zc:wchar_t- - endif - endif - - # All builds get the same runtime setting - CFLAGS_COMMON += $(MS_RUNTIME_OPTION) $(CFLAGS_$(COMPILER_VERSION)) - - - LDEBUG = /debug - - ifeq ($(VTUNE_SUPPORT), true) - OTHER_CFLAGS = -Z7 -Ox - LDEBUG += /pdb:NONE - endif - - # The new Platform SDK and VS2005 has /GS as a default and requires - # bufferoverflowU.lib on the link command line, otherwise - # we get missing __security_check_cookie externals at link time. - BUFFEROVERFLOWLIB = bufferoverflowU.lib - # Always add bufferoverflowU.lib to VS2005 link commands (pack uses LDDFLAGS) - LFLAGS_VS2005 = $(BUFFEROVERFLOWLIB) - - # LFLAGS are the flags given to $(LINK) and used to build the actual DLL file - BASELFLAGS = -nologo /opt:REF /incremental:no - LFLAGS = $(BASELFLAGS) $(LDEBUG) $(EXTRA_LFLAGS) $(LFLAGS_$(COMPILER_VERSION)) - LDDFLAGS += $(LFLAGS_$(COMPILER_VERSION)) - -endif - -# -# Preprocessor macro definitions -# -CPPFLAGS_COMMON = -DWIN32 -DIAL -D_LITTLE_ENDIAN -ifeq ($(ARCH), amd64) - CPPFLAGS_COMMON += -D_AMD64_ -Damd64 -else - CPPFLAGS_COMMON += -DWIN32 -D_X86_ -Dx86 -endif -CPPFLAGS_COMMON += -DWIN32_LEAN_AND_MEAN - -# -# Output options (use specific filenames to avoid parallel compile errors) -# -CFLAGS_COMMON += -Fd$(OBJDIR)/$(basename $(@F)).pdb -Fm$(OBJDIR)/$(basename $(@F)).map - -# -# Add warnings and extra on 64bit issues -# -ifeq ($(ARCH_DATA_MODEL), 64) - CFLAGS_COMMON += -Wp64 -endif -CFLAGS_COMMON += -W$(COMPILER_WARNING_LEVEL) - -# -# Treat compiler warnings as errors, if requested -# -ifeq ($(COMPILER_WARNINGS_FATAL),true) - CFLAGS_COMMON += -WX -endif - -CPPFLAGS_OPT = -CPPFLAGS_DBG = -DDEBUG -DLOGGING - -CXXFLAGS_COMMON = $(CFLAGS_COMMON) -CXXFLAGS_OPT = $(CFLAGS_OPT) -CXXFLAGS_DBG = $(CFLAGS_DBG) - -ifneq ($(LIBRARY),fdlibm) - EXTRA_LIBS += advapi32.lib -endif - -# -# Path and option to link against the VM, if you have to. -# -JVMLIB = $(BOOTDIR)/lib/jvm.lib -JAVALIB = - -ifeq ($(CC_VERSION), msvc) - CC_DEPEND = -FD - CC_DEPEND_FILTER = -else # CC_VERSION -# not supported, but left for historical reference... - CC_DEPEND = -MM - CC_DEPEND_FILTER = $(SED) -e 's!$*\.$(OBJECT_SUFFIX)!$(dir $@)&!g' -endif # CC_VERSION - -LIBRARY_SUFFIX = dll -LIB_SUFFIX = lib - -# Settings for the VERSIONINFO tap on windows. -VERSIONINFO_RESOURCE = $(TOPDIR)/src/windows/resource/version.rc - -RC_FLAGS = /l 0x409 /r - -ifeq ($(VARIANT), OPT) - RC_FLAGS += -d NDEBUG -else - RC_FLAGS += $(MS_RC_DEBUG_OPTION) -endif - -ifndef COPYRIGHT_YEAR - COPYRIGHT_YEAR = 2007 -endif - -RC_FLAGS += -d "JDK_BUILD_ID=$(FULL_VERSION)" \ - -d "JDK_COMPANY=$(COMPANY_NAME)" \ - -d "JDK_COMPONENT=$(PRODUCT_NAME) Platform SE binary" \ - -d "JDK_VER=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VER).$(COOKED_BUILD_NUMBER)" \ - -d "JDK_COPYRIGHT=Copyright \xA9 $(COPYRIGHT_YEAR)" \ - -d "JDK_NAME=$(PRODUCT_NAME) Platform SE $(JDK_MINOR_VERSION) $(JDK_UPDATE_META_TAG)" \ - -d "JDK_FVER=$(JDK_VERSION)" diff --git a/corba/make/common/Defs.gmk b/corba/make/common/Defs.gmk index 2c2d03c48ce..2d5c83db6e0 100644 --- a/corba/make/common/Defs.gmk +++ b/corba/make/common/Defs.gmk @@ -73,54 +73,10 @@ JDK_LOCALES = ja zh_CN # JRE_NONEXIST_LOCALES = en en_US de_DE es_ES fr_FR it_IT ja_JP ko_KR sv_SE zh -# -# All libraries except libjava and libjvm itself link against libjvm and -# libjava, the latter for its exported common utilities. libjava only links -# against libjvm. Programs' makefiles take their own responsibility for -# adding other libs. -# -ifdef PACKAGE -# put JAVALIB first, but do not lose any platform specific values.... - LDLIBS_COMMON = $(JAVALIB) -endif # PACKAGE - -# -# Libraries that must appear ahead of libc.so on the link command line -# -ifdef PROGRAM - - ifeq ($(PLATFORM), solaris) - LDLIBS_COMMON = -lthread -ldl - endif - - ifeq ($(PLATFORM), linux) - LDLIBS_COMMON = -ldl - endif - -endif # PROGRAM - -LDLIBS_COMMON += $(EXTRA_LIBS) - -# -# Default is to build, not import native binaries -# -ifndef IMPORT_NATIVE_BINARIES - IMPORT_NATIVE_BINARIES=false -endif -# If importing libraries in, no incremental builds -ifeq ($(IMPORT_NATIVE_BINARIES),true) - INCREMENTAL_BUILD=false -endif - -# for generated libraries LIBDIR = $(OUTPUTDIR)/lib ABS_LIBDIR = $(ABS_OUTPUTDIR)/lib -# Optional place to save the windows .lib files -LIBFILES_DIR = $(OUTPUTDIR)/libfiles # for ext jre files EXTDIR = $(LIBDIR)/ext -# for generated include files -INCLUDEDIR = $(OUTPUTDIR)/include # for generated class files CLASSBINDIR = $(OUTPUTDIR)/classes DEMOCLASSDIR = $(OUTPUTDIR)/democlasses @@ -131,8 +87,6 @@ BUILDTOOLJARDIR = $(OUTPUTDIR)/btjars ABS_BUILDTOOLJARDIR = $(ABS_OUTPUTDIR)/btjars # for generated java source files GENSRCDIR = $(OUTPUTDIR)/gensrc -# for generated C source files (not javah) -GENNATIVESRCDIR = $(OUTPUTDIR)/gennativesrc # for imported source files IMPORTSRCDIR = $(OUTPUTDIR)/impsrc # for imported documents @@ -196,19 +150,6 @@ override ABS_TEMPDIR = $(ABS_OUTPUTDIR)/$(UNIQUE_PATH) dummy1:=$(shell $(MKDIR) -p $(TEMPDIR)) dummy2:=$(shell $(MKDIR) -p $(TEMP_DISK)) -# OBJDIRNAME is the name of the directory where the object code is to -# be placed. It's name depends on whether the data model architecture -# is 32-bit or not. -ifneq ($(ARCH_DATA_MODEL), 32) - OBJDIRNAME = obj$(ARCH_DATA_MODEL)$(OBJDIRNAME_SUFFIX) -else - OBJDIRNAME = obj$(OBJDIRNAME_SUFFIX) -endif -OBJDIR = $(TEMPDIR)/$(OBJDIRNAME) - -# CLASSHDRDIR is where the generated C Class Header files go. -CLASSHDRDIR = $(TEMPDIR)/CClassHeaders - # # CLASSDESTDIR can be used to specify the directory where generated classes # are to be placed. The default is CLASSBINDIR. @@ -217,11 +158,6 @@ ifndef CLASSDESTDIR CLASSDESTDIR = $(CLASSBINDIR) endif -INCLUDES = -I. -I$(CLASSHDRDIR) \ - $(patsubst %,-I%,$(subst $(CLASSPATH_SEPARATOR), ,$(VPATH.h))) $(OTHER_INCLUDES) -OTHER_CPPFLAGS = $(INCLUDES) - - # # vpaths. These are the default locations searched for source files. # GNUmakefiles of individual areas often override the default settings. @@ -235,35 +171,6 @@ VPATH0.java = $(GENSRCDIR)$(CLASSPATH_SEPARATOR)$(PLATFORM_SRC)/classes$(CLASSPA VPATH.java = $(VPATH0.java) vpath %.java $(VPATH.java) vpath %.class $(CLASSBINDIR) -vpath %.$(OBJECT_SUFFIX) $(OBJDIR) - -# -# VPATH.h is used elsewhere to generate include flags. By default, -# anyone has access to the include files that the JVM area exports, -# namely jni.h, jvm.h, and jni_utils.h, plus their platform-specific -# relatives. -# -ifeq ($(PLATFORM), windows) - VPATH.h = $(BOOTDIR)/include;$(BOOTDIR)/include/$(PLATFORM_INCLUDE_NAME) -else - VPATH.h = $(PLATFORM_SRC)/javavm/export$(CLASSPATH_SEPARATOR)$(SHARE_SRC)/javavm/export$(CLASSPATH_SEPARATOR)$(SHARE_SRC)/javavm/include$(CLASSPATH_SEPARATOR)$(PLATFORM_SRC)/javavm/include -endif -vpath %.h $(VPATH.h) - -# -# Used in two ways: helps link against libjava.so. Also if overridden -# determines where your shared library is installed. -# -ifndef LIB_LOCATION - LIB_LOCATION = $(LIBDIR)/$(LIBARCH) -endif - -# -# Java header and stub variables -# -CLASSHDRS = $(patsubst %,$(CLASSHDRDIR)/%.h,$(subst .,_,$(CLASSES.export))) -CLASSSTUBOBJS = classstubs.$(OBJECT_SUFFIX) -STUBPREAMBLE = $(INCLUDEDIR)/StubPreamble.h # # Classpath seen by javac (different from the one seen by the VM @@ -338,38 +245,9 @@ define OTHERSUBDIRS-loop done endef -# -# Create BYFILE OPT and DBG settings, if CFLAGS_OPT/foobar.o is set then it is -# used for this file, otherwise the default settings are used. -# -CFLAGS_$(VARIANT)/BYFILE = $(CFLAGS_$(VARIANT)/$(@F)) \ - $(CFLAGS_$(VARIANT)$(CFLAGS_$(VARIANT)/$(@F))) -CXXFLAGS_$(VARIANT)/BYFILE = $(CXXFLAGS_$(VARIANT)/$(@F)) \ - $(CXXFLAGS_$(VARIANT)$(CXXFLAGS_$(VARIANT)/$(@F))) - -# -# Tool flags -# -ASFLAGS = $(ASFLAGS_$(VARIANT)) $(ASFLAGS_COMMON) $(OTHER_ASFLAGS) -CFLAGS = $(CFLAGS_$(VARIANT)/BYFILE) $(CFLAGS_COMMON) $(OTHER_CFLAGS) -CXXFLAGS = $(CXXFLAGS_$(VARIANT)/BYFILE) $(CXXFLAGS_COMMON) $(OTHER_CXXFLAGS) -CPPFLAGS = $(CPPFLAGS_$(VARIANT)) $(CPPFLAGS_COMMON) $(OTHER_CPPFLAGS) \ - $(DEFINES) $(OPTIONS:%=-D%) -LDFLAGS = $(LDFLAGS_$(VARIANT)) $(LDFLAGS_COMMON) $(OTHER_LDFLAGS) -LDLIBS = $(OTHER_LDLIBS) $(LDLIBS_$(VARIANT)) $(LDLIBS_COMMON) -LINTFLAGS = $(LINTFLAGS_$(VARIANT)) $(LINTFLAGS_COMMON) \ - $(OTHER_LINTFLAGS) - -# this should be moved into Defs-.gmk..... -ifeq ($(PLATFORM), windows) - VERSION_DEFINES = -DRELEASE="\"$(RELEASE)\"" -else - VERSION_DEFINES = -DRELEASE='"$(RELEASE)"' -endif - # Prevent the use of many default suffix rules we do not need .SUFFIXES: -.SUFFIXES: .c .o .h .obj .cpp .hpp .java .class +.SUFFIXES: .java .class # Make sure we are all insane ifdef INSANE diff --git a/corba/make/common/Library.gmk b/corba/make/common/Library.gmk deleted file mode 100644 index ffd3a3ab701..00000000000 --- a/corba/make/common/Library.gmk +++ /dev/null @@ -1,275 +0,0 @@ -# -# Copyright (c) 1995, 2009, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Generic makefile for building shared libraries. -# - -include $(TOPDIR)/make/common/Classes.gmk - -# -# It is important to define these *after* including Classes.gmk -# in order to override the values defined inthat makefile. -# - -ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(LIBRARY_SUFFIX) -ACTUAL_LIBRARY_DIR = $(LIB_LOCATION) -ACTUAL_LIBRARY = $(ACTUAL_LIBRARY_DIR)/$(ACTUAL_LIBRARY_NAME) - -library:: $(ACTUAL_LIBRARY) - -FILES_o = $(patsubst %.c, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) -FILES_o += $(patsubst %.s, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_s)))) -FILES_o += $(patsubst %.cpp, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp)))) - -ifeq ($(INCREMENTAL_BUILD),true) -FILES_d = $(patsubst %.c, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) -FILES_d += $(patsubst %.cpp, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp)))) -endif # INCREMENTAL_BUILD - -ifeq ($(PLATFORM),solaris) -# List of all lint files, one for each .c file (only for C) -FILES_ln = $(patsubst %.c, %.$(LINT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) -endif - -# -# C++ libraries must be linked with CC. -# -ifdef CPLUSPLUSLIBRARY -LINKER=$(LINK.cc) -else -LINKER=$(LINK.c) -endif - -# We either need to import (copy) libraries in, or build them -$(ACTUAL_LIBRARY):: $(INIT) $(TEMPDIR) $(LIBDIR) $(BINDIR) $(EXTDIR) classheaders - -# -# COMPILE_APPROACH: Different approaches to compile up the native object -# files as quickly as possible. -# The setting of parallel works best on Unix, batch on Windows. -# - -COMPILE_FILES_o = $(OBJDIR)/.files_compiled -$(COMPILE_FILES_o): $(FILES_d) $(FILES_o) - @$(ECHO) "$<" >> $@ -clean:: - $(RM) $(COMPILE_FILES_o) - -# -# COMPILE_APPROACH=parallel: Will trigger compilations (just compilations) to -# happen in parallel. Greatly decreases Unix build time, even on single CPU -# machines, more so on multiple CPU machines. Default is 2 compiles -# at a time, but can be adjusted with ALT_PARALLEL_COMPILE_JOBS. -# Note that each .d file will also be dependent on it's .o file, see -# Rules.gmk. -# Note this does not depend on Rules.gmk to work like batch (below) -# and this technique doesn't seem to help Windows build time nor does -# it work very well, it's possible the Windows Visual Studio compilers -# don't work well in a parallel situation, this needs investigation. -# - -ifeq ($(COMPILE_APPROACH),parallel) - -.PHONY: library_parallel_compile - -library_parallel_compile: - @$(ECHO) "Begin parallel compiles: $(shell $(PWD))" - @$(MAKE) -j $(PARALLEL_COMPILE_JOBS) $(COMPILE_FILES_o) - @$(ECHO) "Done with parallel compiles: $(shell $(PWD))" - -$(ACTUAL_LIBRARY):: library_parallel_compile - -endif - -# -# COMPILE_APPROACH=batch: Will trigger compilations (just compilations) to -# happen in batch mode. Greatly decreases Windows build time. -# See logic in Rules.gmk for how compiles happen, the $(MAKE) in -# library_batch_compile below triggers the actions in Rules.gmk. -# Note that each .d file will also be dependent on it's .o file, see -# Rules.gmk. -# -ifeq ($(COMPILE_APPROACH),batch) - -.PHONY: library_batch_compile - -library_batch_compile: - @$(ECHO) "Begin BATCH compiles: $(shell $(PWD))" - $(MAKE) $(COMPILE_FILES_o) - $(MAKE) batch_compile - @$(ECHO) "Done with BATCH compiles: $(shell $(PWD))" - $(MAKE) COMPILE_APPROACH=normal $(COMPILE_FILES_o) - -$(ACTUAL_LIBRARY):: library_batch_compile - -endif - -ifeq ($(PLATFORM), windows) - -# -# Library building rules. -# - -$(LIBRARY).lib:: $(OBJDIR) - -# build it into $(OBJDIR) so that the other generated files get put -# there, then copy just the DLL (and MAP file) to the requested directory. -# -$(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lcf - @$(prep-target) - @$(MKDIR) -p $(OBJDIR) - $(LINK) -dll -out:$(OBJDIR)/$(@F) \ - -map:$(OBJDIR)/$(LIBRARY).map \ - $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \ - $(OTHER_LCF) $(JAVALIB) $(LDLIBS) - $(CP) $(OBJDIR)/$(@F) $@ - $(CP) $(OBJDIR)/$(LIBRARY).map $(@D) - $(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D) - -$(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m) - @$(prep-target) - @$(MKDIR) -p $(TEMPDIR) - @$(ECHO) $(FILES_o) > $@ -ifndef LOCAL_RESOURCE_FILE - @$(ECHO) $(OBJDIR)/$(LIBRARY).res >> $@ -endif - @$(ECHO) Created $@ - -RC_FLAGS += /D "JDK_FNAME=$(LIBRARY).dll" \ - /D "JDK_INTERNAL_NAME=$(LIBRARY)" \ - /D "JDK_FTYPE=0x2L" - -$(OBJDIR)/$(LIBRARY).res: $(VERSIONINFO_RESOURCE) -ifndef LOCAL_RESOURCE_FILE - @$(prep-target) - $(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE) -endif - -# -# Install a .lib file if required. -# -ifeq ($(INSTALL_DOT_LIB), true) -$(ACTUAL_LIBRARY):: $(LIBDIR)/$(LIBRARY).lib - -clean:: - -$(RM) $(LIBDIR)/$(LIBRARY).lib - -$(LIBDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lib - $(install-file) - -$(LIBDIR)/$(LIBRARY).dll:: $(OBJDIR)/$(LIBRARY).dll - $(install-file) - -endif # INSTALL_DOT_LIB - -else # PLATFORM - -# -# On Solaris, use mcs to write the version into the comment section of -# the shared library. On other platforms set this to false at the -# make command line. -# -$(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder) - @$(prep-target) - @$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), _OPT=$(_OPT)" - @$(ECHO) "Rebuilding $@ because of $?" - $(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS) -ifeq ($(WRITE_LIBVERSION),true) - $(MCS) -d -a "$(FULL_VERSION)" $@ -endif # WRITE_LIBVERSION - -endif # PLATFORM - -# -# Cross check all linted files against each other -# -ifeq ($(PLATFORM),solaris) -lint.errors : $(FILES_ln) - $(LINT.c) $(FILES_ln) $(LDLIBS) -endif - -# -# Class libraries with JNI native methods get a include to the package. -# -ifdef PACKAGE -vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR) -vpath %.c $(SHARE_SRC)/native/$(PKGDIR) -OTHER_INCLUDES += -I$(SHARE_SRC)/native/common -I$(PLATFORM_SRC)/native/common -OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) \ - -I$(PLATFORM_SRC)/native/$(PKGDIR) -endif - -# -# Clean/clobber rules -# -clean:: - $(RM) -r $(ACTUAL_LIBRARY) - -clobber:: clean - -# -# INCREMENTAL_BUILD means that this workspace will be built over and over -# possibly incrementally. This means tracking the object file dependencies -# on include files so that sources get re-compiled when the include files -# change. When building from scratch and doing a one time build (like -# release engineering or nightly builds) set INCREMENTAL_BUILD=false. -# - -ifeq ($(INCREMENTAL_BUILD),true) - -# -# Workaround: gnumake sometimes says files is empty when it shouldn't -# was: files := $(foreach file, $(wildcard $(OBJDIR)/*.$(DEPEND_SUFFIX)), $(file)) -# -files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null) - -# -# Only include these files if we have any. -# -ifneq ($(strip $(files)),) - -include $(files) - -endif # files - -endif # INCREMENTAL_BUILD - -# -# Default dependencies -# - -all: build - -build: library - -debug: - $(MAKE) VARIANT=DBG build - -fastdebug: - $(MAKE) VARIANT=DBG FASTDEBUG=true build - -.PHONY: all build debug fastdebug - diff --git a/corba/make/common/Mapfile-vers.gmk b/corba/make/common/Mapfile-vers.gmk deleted file mode 100644 index e4e151f3214..00000000000 --- a/corba/make/common/Mapfile-vers.gmk +++ /dev/null @@ -1,98 +0,0 @@ -# -# Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Makefile for linking with mapfiles. -# -# NOTE: Not using a mapfile will expose all your extern functions and -# extern data symbols as part of your interface, so unless your -# extern names are safe from being mistaken as names from other -# libraries, you better use a mapfile, or use a unique naming -# convention on all your extern symbols. -# -# The mapfile will establish versioning by defining the exported interface. -# -# The mapfile can also force certain .o files or elf sections into the -# the different segments of the resulting library/program image. -# -# The macro FILES_m can contain any number of mapfiles. -# - -# Always make sure 'all' is the default rule -mapfile_default_rule: all - -ifeq ($(PLATFORM), solaris) - -ifeq ($(VARIANT), OPT) - # OPT build MUST have a mapfile? - ifndef FILES_m - FILES_m = mapfile-vers - endif - - # If we are re-ordering functions in this solaris library, we need to make - # sure that -xF is added to the compile lines. This option is critical and - # enables the functions to be reordered. - ifdef FILES_reorder - CFLAGS_OPT += -xF - CXXFLAGS_OPT += -xF - endif - -INIT += $(TEMPDIR)/mapfile-vers - -$(TEMPDIR)/mapfile-vers : $(FILES_m) $(FILES_reorder) - $(prep-target) - $(CAT) $(FILES_m) > $@ - ifdef FILES_reorder - $(SED) -e 's=OUTPUTDIR=$(OUTPUTDIR)=' $(FILES_reorder) >> $@ - endif -endif # VARIANT - -ifndef LDNOMAP - LDMAPFLAGS_OPT = -M$(TEMPDIR)/mapfile-vers - LDMAPFLAGS_DBG = $(FILES_m:%=-M%) -endif - -endif # PLATFORM - - -ifeq ($(PLATFORM), linux) - -ifeq ($(VARIANT), OPT) - # OPT build MUST have a mapfile? - ifndef FILES_m - FILES_m = mapfile-vers - endif -endif # VARIANT - -ifndef LDNOMAP - LDMAPFLAGS_OPT = $(FILES_m:%=-Xlinker -version-script=%) - LDMAPFLAGS_DBG = $(FILES_m:%=-Xlinker -version-script=%) -endif - -endif # PLATFORM - -LDFLAGS_OPT += $(LDMAPFLAGS_OPT) -LDFLAGS_DBG += $(LDMAPFLAGS_DBG) - diff --git a/corba/make/common/Rules.gmk b/corba/make/common/Rules.gmk index ae4633de512..a18978697b4 100644 --- a/corba/make/common/Rules.gmk +++ b/corba/make/common/Rules.gmk @@ -34,7 +34,7 @@ rules_default_rule: all # # Directory set up. (Needed by deploy workspace) # -$(CLASSDESTDIR) $(CLASSHDRDIR) $(OBJDIR) $(OUTPUTDIR) $(BINDIR) $(LIBDIR) $(LIBDIR)/$(LIBARCH) $(TEMPDIR) $(EXTDIR): +$(CLASSDESTDIR) $(OUTPUTDIR) $(TEMPDIR) $(EXTDIR): $(MKDIR) -p $@ # @@ -163,9 +163,6 @@ $(CLASSDESTDIR)/%.class: $(SHARE_SRC)/classes/%.java # List of class files needed FILES_class = $(FILES_java:%.java=$(CLASSDESTDIR)/%.class) -# Got to include exported files. -FILES_class += $(FILES_export:%.java=$(CLASSDESTDIR)/%.class) - # Construct list of java sources we need to compile source_list_prime: @$(MKDIR) -p $(TEMPDIR) @@ -214,50 +211,7 @@ endif classes.clean: packages.clean $(RM) $(JAVA_SOURCE_LIST) -# -# C and C++ make dependencies -# -include $(TOPDIR)/make/common/internal/NativeCompileRules.gmk - -# -# Running Javah to generate stuff into CClassHeaders. -# - -ifdef FILES_export - -CLASSES.export = $(subst /,.,$(FILES_export:%.java=%)) -CLASSES.export += $(subst /,.,$(FILES_export2:%.java=%)) -CLASSES.export += $(subst /,.,$(FILES_export3:%.java=%)) -CLASSES_export = $(FILES_export:%.java=$(CLASSDESTDIR)/%.class) -CLASSES_export += $(FILES_export2:%.java=$(CLASSDESTDIR)/%.class) -CLASSES_export += $(FILES_export3:%.java=$(CLASSDESTDIR)/%.class) - -# Fix when deploy workspace makefiles don't depend on this name -#CLASSHDR_DOTFILE=$(CLASSHDRDIR)/.classheaders - -CLASSHDR_DOTFILE=$(OBJDIR)/.class.headers.$(ARCH) - -classheaders: classes $(CLASSHDR_DOTFILE) - -$(CLASSHDR_DOTFILE): $(CLASSES_export) - $(prep-target) - $(JAVAH_CMD) -d $(CLASSHDRDIR)/ \ - $(CLASSES.export) $(subst $$,\$$,$(EXPORTED_inner)) - @$(java-vm-cleanup) - @$(TOUCH) $@ - -classheaders.clean: - $(RM) -r $(CLASSHDRDIR) $(CLASSHDR_DOTFILE) - -else # FILES_export - -classheaders: classes - -classheaders.clean: - -endif # FILES_export - -clean clobber:: classheaders.clean classes.clean .delete.classlist +clean clobber:: classes.clean .delete.classlist # # Default dependencies @@ -265,12 +219,11 @@ clean clobber:: classheaders.clean classes.clean .delete.classlist all: build -build: classheaders +build: classes default: all .PHONY: all build clean clobber \ .delete.classlist classes .compile.classlist classes.clean \ - classheaders classheaders.clean \ batch_compile diff --git a/corba/make/common/internal/NativeCompileRules.gmk b/corba/make/common/internal/NativeCompileRules.gmk deleted file mode 100644 index 5d9cf729ea6..00000000000 --- a/corba/make/common/internal/NativeCompileRules.gmk +++ /dev/null @@ -1,214 +0,0 @@ -# -# Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Native C/C++ Compile Rules -# - -# -# INCREMENTAL_BUILD: Record the #include file dependencies. -# -# NOTE: We build make include files with the suffix -# $(DEPEND_SUFFIX) on every compilation. These are initially -# created as temp files just in case a ^C kills it in the middle. -# Compiler is smart enough to handle ^C and not create the .o file, or -# is supposed to be that smart, but the .$(DEPEND_SUFFIX) file -# creation here isn't. -# These .$(DEPEND_SUFFIX) files are included by Library.gmk and -# Program.gmk, when they exist (Search for 'make dependencies'). -# - -ifeq ($(INCREMENTAL_BUILD),true) - -$(OBJDIR)/%.$(DEPEND_SUFFIX): %.c - @$(prep-target) - @$(ECHO) "Creating $@" - @$(RM) $@.temp - @$(CC) $(CC_DEPEND) $(CPPFLAGS) $< 2> $(DEV_NULL) | \ - $(CC_DEPEND_FILTER) > $@.temp - @$(MV) $@.temp $@ - -$(OBJDIR)/%.$(DEPEND_SUFFIX): %.cpp - @$(prep-target) - @$(ECHO) "Creating $@" - @$(RM) $@.temp - @$(CXX) $(CC_DEPEND) $(CPPFLAGS) $(CXXFLAGS) $< 2> $(DEV_NULL) | \ - $(CC_DEPEND_FILTER) > $@.temp - @$(MV) $@.temp $@ - -endif # INCREMENTAL_BUILD - -# -# C, C++, asm files. -# -# Normal or parallel compile rule is the same, but batch compiles require -# we save up the sources files that use the same compile line so that we -# can do one compile line. -# - -ifneq ($(COMPILE_APPROACH), batch) - -$(OBJDIR)/%.$(OBJECT_SUFFIX): %.c - @$(prep-target) - $(COMPILE.c) $(CC_OBJECT_OUTPUT_FLAG)$@ $(CFLAGS_GPROF) $< - @$(check-conventions) - -$(OBJDIR)/%.$(OBJECT_SUFFIX): %.cpp - @$(prep-target) - $(COMPILE.cc) $(CC_OBJECT_OUTPUT_FLAG)$@ $(CFLAGS_GPROF) $< - @$(check-conventions) - -else - - # - # Batch compiling might be faster if the compiler was smart about recognizing - # optimization opportunities available when all files are being compiled - # the same way. Unfortunately this is rare. - # Automatic pre-compiled headers (pch) might be a possibility so we - # add any auto pch options here. - # So we save all the source files that have the same compile line as the - # first file. A normal compile pass is made after the batch compile - # to catch anything missed. - # If the compilers had a -o option that allowed us to direct where to - # write the object files to, then we would not need to save the object - # file list or move them from the make directory to the build directory. - # - - # Source names - COMPILE_LIST.c = $(OBJDIR)/.source_names_c - COMPILE_LIST.cpp = $(OBJDIR)/.source_names_cpp - - # Object file list - COMPILE_OBJ_LIST.c = $(OBJDIR)/.obj_names_c - COMPILE_OBJ_LIST.cpp = $(OBJDIR)/.obj_names_cpp - - # The compile line - COMPILE_BATCH.c = $(OBJDIR)/.compile_c - COMPILE_BATCH.cpp = $(OBJDIR)/.compile_cpp - - # The compile line for the current target - THIS_COMPILE_BATCH.c = $(COMPILE_BATCH.c)-$(@F) - THIS_COMPILE_BATCH.cpp = $(COMPILE_BATCH.cpp)-$(@F) - -$(OBJDIR)/%.$(OBJECT_SUFFIX): %.c - @$(prep-target) - @$(ECHO) "$(COMPILE.c) $(CFLAGS_GPROF)" > $(THIS_COMPILE_BATCH.c) - @if [ ! -s $(COMPILE_BATCH.c) ] ; then \ - $(CP) $(THIS_COMPILE_BATCH.c) $(COMPILE_BATCH.c) ; \ - $(ECHO) $< > $(COMPILE_LIST.c); \ - $(ECHO) $(@F) > $(COMPILE_OBJ_LIST.c); \ - elif [ "`$(DIFF) -w -b $(THIS_COMPILE_BATCH.c) $(COMPILE_BATCH.c)`" \ - = "" ] ; then \ - $(ECHO) $< >> $(COMPILE_LIST.c); \ - $(ECHO) $(@F) >> $(COMPILE_OBJ_LIST.c); \ - fi - @$(RM) $(THIS_COMPILE_BATCH.c) - @$(check-conventions) - -$(OBJDIR)/%.$(OBJECT_SUFFIX): %.cpp - @$(prep-target) - @$(ECHO) "$(COMPILE.cpp) $(CFLAGS_GPROF)" > $(THIS_COMPILE_BATCH.cpp) - @if [ ! -s $(COMPILE_BATCH.cpp) ] ; then \ - $(CP) $(THIS_COMPILE_BATCH.cpp) $(COMPILE_BATCH.cpp) ; \ - $(ECHO) $< > $(COMPILE_LIST.cpp); \ - $(ECHO) $(@F) > $(COMPILE_OBJ_LIST.cpp); \ - elif [ "`$(DIFF) -w -b $(THIS_COMPILE_BATCH.cpp) $(COMPILE_BATCH.cpp)`"\ - = "" ] ; then \ - $(ECHO) $< >> $(COMPILE_LIST.cpp); \ - $(ECHO) $(@F) >> $(COMPILE_OBJ_LIST.cpp); \ - fi - @$(RM) $(THIS_COMPILE_BATCH.cpp) - @$(check-conventions) - -batch_compile: $(FILES_o) - @$(ECHO) "Doing batch compilations" - @if [ -s $(COMPILE_LIST.c) ] ; then \ - $(ECHO) "$(COMPILE.c) $(CFLAGS_GPROF) $(AUTOMATIC_PCH_OPTION) \ - `$(CAT) $(COMPILE_LIST.c)`" ; \ - ( $(COMPILE.c) $(CFLAGS_GPROF) $(AUTOMATIC_PCH_OPTION) \ - `$(CAT) $(COMPILE_LIST.c)` && \ - $(ECHO) "$(MV) `$(CAT) $(COMPILE_OBJ_LIST.c)` $(OBJDIR)" && \ - $(MV) `$(CAT) $(COMPILE_OBJ_LIST.c)` $(OBJDIR) ) || exit 1 ; \ - fi - @if [ -s $(COMPILE_LIST.cpp) ] ; then \ - $(ECHO) "$(COMPILE.cpp) $(CFLAGS_GPROF) $(AUTOMATIC_PCH_OPTION) \ - `$(CAT) $(COMPILE_LIST.cpp)`" ; \ - ( $(COMPILE.cpp) $(CFLAGS_GPROF) $(AUTOMATIC_PCH_OPTION) \ - `$(CAT) $(COMPILE_LIST.cpp)` && \ - $(ECHO) "$(MV) `$(CAT) $(COMPILE_OBJ_LIST.cpp)` $(OBJDIR)" && \ - $(MV) `$(CAT) $(COMPILE_OBJ_LIST.cpp)` $(OBJDIR) ) || exit 1 ; \ - fi - @$(RM) $(COMPILE_BATCH.c) $(COMPILE_LIST.c) $(COMPILE_OBJ_LIST.c) - @$(RM) $(COMPILE_BATCH.cpp) $(COMPILE_LIST.cpp) $(COMPILE_OBJ_LIST.cpp) - -endif - -# newer as does not handle c++ style comments -$(OBJDIR)/%.$(OBJECT_SUFFIX): %.s - ifneq ($(CC_VERSION), gcc) - @$(prep-target) - $(COMPILE.s) $(CC_OBJECT_OUTPUT_FLAG)$@ $< - else - @$(prep-target) - $(CPP) -x assembler-with-cpp $< | $(COMPILE.s) -o $@ - endif - @$(check-conventions) - -# -# Quick hack for making the compiler generate just the assembly file. -# $ gnumake obj/sparc/myfile.s -# -$(OBJDIR)/%.s: %.c - @$(prep-target) - $(COMPILE.c) $(CC_OBJECT_OUTPUT_FLAG)$@ -S $< - @$(check-conventions) - -# remove the intermediate files from the directories. -# (If VARIANT=OPT, this removes all debug and fastdebug files too) -clobber clean:: - $(RM) -r $(OBJDIR) - $(RM) -r $(OBJDIR)_* - -# -# Lint support -# (The 'lint' rule below is an older rule not using the .$(LINT_SUFFIX) files) -# - -ifeq ($(PLATFORM), solaris) -$(OBJDIR)/%.$(LINT_SUFFIX): %.c - @$(prep-target) - $(LINT.c) -dirout=$(OBJDIR) -c $< -lint.clean: - $(RM) $(OBJDIR)/*.$(LINT_SUFFIX) -# Old rule -lint: $(FILES_c) - ifneq ($(FILES_c),) - $(LINT.c) -Ncheck -Nlevel=3 $? $(LDLIBS) > lint.$(ARCH) 2>&1 - endif -endif - -.PHONY: batch_compile - - diff --git a/corba/make/common/shared/Compiler-gcc.gmk b/corba/make/common/shared/Compiler-gcc.gmk deleted file mode 100644 index 3c3604b3c72..00000000000 --- a/corba/make/common/shared/Compiler-gcc.gmk +++ /dev/null @@ -1,119 +0,0 @@ -# -# Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# GCC Compiler settings -# - -COMPILER_NAME=GCC - -ifeq ($(PLATFORM), windows) - - # Settings specific to Windows, pretty stale, hasn't been used - CC = $(COMPILER_PATH)gcc - CPP = $(COMPILER_PATH)gcc -E - CXX = $(COMPILER_PATH)g++ - CCC = $(COMPILER_PATH)g++ - LIBEXE = $(COMPILER_PATH)lib - LINK = $(COMPILER_PATH)link - RC = $(MSDEVTOOLS_PATH)link - LINK32 = $(LINK) - RSC = $(RC) - # unset any GNU Make settings of MFLAGS and MAKEFLAGS which may mess up nmake - NMAKE = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo - ifeq ($(ARCH_DATA_MODEL), 32) - CC_VER = UNKNOWN - CC_TYPE = UNKNOWN - else - CC_VER = UNKNOWN - CC_TYPE = UNKNOWN - endif - _LINK_VER :=$(shell $(LINK) 2>&1 | $(HEAD) -n 1) - LINK_VER :=$(call GetVersion,"$(_LINK_VER)") - -endif - -ifeq ($(PLATFORM), linux) - - # Settings specific to Linux - CC = $(COMPILER_PATH)gcc - CPP = $(COMPILER_PATH)gcc -E - # statically link libstdc++ before C++ ABI is stablized on Linux - STATIC_CXX = true - ifeq ($(STATIC_CXX),true) - # g++ always dynamically links libstdc++, even we use "-Wl,-Bstatic -lstdc++" - # We need to use gcc to statically link the C++ runtime. gcc and g++ use - # the same subprocess to compile C++ files, so it is OK to build using gcc. - CXX = $(COMPILER_PATH)gcc - else - CXX = $(COMPILER_PATH)g++ - endif - ifeq ($(ZERO_BUILD), true) - # zero - REQUIRED_CC_VER = 3.2 - REQUIRED_GCC_VER = 3.2.* - else - ifneq ("$(findstring sparc,$(ARCH))", "") - # sparc or sparcv9 - REQUIRED_CC_VER = 4.0 - else - ifeq ($(ARCH_DATA_MODEL), 32) - # i586 - REQUIRED_CC_VER = 3.2 - else - ifeq ($(ARCH), amd64) - # amd64 - REQUIRED_CC_VER = 3.2 - endif - ifeq ($(ARCH), ia64) - # ia64 - REQUIRED_CC_VER = 3.2 - endif - endif - endif - endif - # Option used to create a shared library - SHARED_LIBRARY_FLAG = -shared -mimpure-text - SUN_COMP_VER := $(shell $(CC) --verbose 2>&1 ) - -endif - -ifeq ($(PLATFORM), solaris) - - # Settings specific to Solaris - CC = $(COMPILER_PATH)gcc - CPP = $(COMPILER_PATH)gcc -E - CXX = $(COMPILER_PATH)g++ - REQUIRED_CC_VER = 3.2 - - # Option used to create a shared library - SHARED_LIBRARY_FLAG = -G - -endif - -# Get gcc version -_CC_VER :=$(shell $(CC) -dumpversion 2>&1 ) -CC_VER :=$(call GetVersion,"$(_CC_VER)") - diff --git a/corba/make/common/shared/Compiler-msvc.gmk b/corba/make/common/shared/Compiler-msvc.gmk deleted file mode 100644 index ed7c281f714..00000000000 --- a/corba/make/common/shared/Compiler-msvc.gmk +++ /dev/null @@ -1,186 +0,0 @@ -# -# Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# MSVC Compiler settings -# - -ifeq ($(PLATFORM), windows) - CC = $(COMPILER_PATH)cl - CPP = $(COMPILER_PATH)cl - CXX = $(COMPILER_PATH)cl - CCC = $(COMPILER_PATH)cl - LIBEXE = $(COMPILER_PATH)lib - LINK = $(COMPILER_PATH)link - RC = $(MSDEVTOOLS_PATH)rc - LINK32 = $(LINK) - RSC = $(RC) - - # Fill in unknown values - COMPILER_NAME=Unknown MSVC Compiler - COMPILER_VERSION= - REQUIRED_CC_VER= - REQUIRED_LINK_VER= - - # unset any GNU Make settings of MFLAGS and MAKEFLAGS which may mess up nmake - NMAKE = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo - - # Compiler version and type (Always get word after "Version") - ifndef CC_VER - CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(SED) 's/.*\(Version.*\)/\1/' | $(NAWK) '{print $$2}') - export CC_VER - endif - - # SDK-64 and MSVC6 put REBASE.EXE in a different places - go figure... - ifeq ($(ARCH_DATA_MODEL), 32) - ifndef LINK_VER - LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}') - export LINK_VER - endif - CC_MAJORVER :=$(call MajorVersion,$(CC_VER)) - ifeq ($(CC_MAJORVER), 13) - # This should be: CC_VER=13.10.3077 LINK_VER=7.10.3077 - REQUIRED_CC_VER = 13.10.3077 - REQUIRED_LINK_VER = 7.10.3077 - COMPILER_NAME=Visual Studio .NET 2003 Professional C++ - COMPILER_VERSION=VS2003 - REBASE = $(COMPILER_PATH)../../Common7/Tools/Bin/rebase - MTL = $(COMPILER_PATH)../../Common7/Tools/Bin/midl - ifndef COMPILER_PATH - COMPILER_PATH := $(error COMPILER_PATH cannot be empty here) - endif - endif - ifeq ($(CC_MAJORVER), 14) - # This should be: CC_VER=14.00.50727.42 LINK_VER=8.00.50727.42 - REQUIRED_CC_VER = 14.00.50727.42 - REQUIRED_LINK_VER = 8.00.50727.42 - COMPILER_NAME=Visual Studio 8 - COMPILER_VERSION=VS2005 - REBASE = $(COMPILER_PATH)../../Common8/Tools/Bin/rebase - MTL = $(COMPILER_PATH)../../Common8/Tools/Bin/midl - ifndef COMPILER_PATH - COMPILER_PATH := $(error COMPILER_PATH cannot be empty here) - endif - endif - ifeq ($(CC_MAJORVER), 15) - # This should be: CC_VER=15.00.21022.08 LINK_VER=9.00.21022.08 - REQUIRED_CC_VER = 15.00.21022.08 - REQUIRED_LINK_VER = 9.00.21022.08 - COMPILER_NAME=Visual Studio 9 - COMPILER_VERSION=VS2008 - #rebase and midl moved out of Visual Studio into the SDK: - REBASE = $(MSDEVTOOLS_PATH)/rebase - MTL = $(MSDEVTOOLS_PATH)/midl.exe - ifndef COMPILER_PATH - COMPILER_PATH := $(error COMPILER_PATH cannot be empty here) - endif - endif - ifeq ($(CC_MAJORVER), 16) - # This should be: CC_VER=16.00.30319.01 LINK_VER=10.00.30319.01 - REQUIRED_CC_VER = 16.00.30319.01 - REQUIRED_LINK_VER = 10.00.30319.01 - COMPILER_NAME=Visual Studio 10 - COMPILER_VERSION=VS2010 - #rebase and midl moved out of Visual Studio into the SDK: - REBASE = $(MSDEVTOOLS_PATH)/rebase - MTL = $(MSDEVTOOLS_PATH)/midl.exe - ifndef COMPILER_PATH - COMPILER_PATH := $(error COMPILER_PATH cannot be empty here) - endif - endif - else - # else ARCH_DATA_MODEL is 64 - ifndef LINK_VER - LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}') - export LINK_VER - endif - CC_MAJORVER :=$(call MajorVersion,$(CC_VER)) - CC_MINORVER :=$(call MinorVersion,$(CC_VER)) - CC_MICROVER :=$(call MicroVersion,$(CC_VER)) - ifeq ($(ARCH), ia64) - REQUIRED_CC_VER = 13.00.9337.7 - REQUIRED_LINK_VER = 7.00.9337.7 - endif - ifeq ($(ARCH), amd64) - REQUIRED_CC_VER = 14.00.40310.41 - REQUIRED_LINK_VER = 8.00.40310.39 - endif - ifeq ($(CC_MAJORVER), 13) - ifeq ($(ARCH), ia64) - # This should be: CC_VER=13.00.9337.7 LINK_VER=7.00.9337.7 - COMPILER_NAME=Microsoft Platform SDK - November 2001 Edition - COMPILER_VERSION=VS2003 - endif - endif - ifeq ($(CC_MAJORVER), 14) - ifeq ($(ARCH), amd64) - ifeq ($(CC_MICROVER), 30701) - # This should be: CC_VER=14.00.30701 LINK_VER=8.00.30701 - # WARNING: it says 14, but it is such an early build it doesn't - # have all the VS2005 compiler option changes, so treat - # this like a VS2003 compiler. - COMPILER_NAME=Microsoft Platform SDK - February 2003 Edition - COMPILER_VERSION=VS2003 - else - # This should be: CC_VER=14.00.40310.41 LINK_VER=8.00.40310.39 - COMPILER_NAME=Microsoft Platform SDK - April 2005 Edition (3790.1830) - COMPILER_VERSION=VS2005 - endif - endif - endif - ifeq ($(CC_MAJORVER), 15) - # This should be: CC_VER=15.00.21022.8 LINK_VER=9.00.21022.8 - REQUIRED_CC_VER = 15.00.21022.8 - REQUIRED_LINK_VER = 9.00.21022.8 - COMPILER_NAME=Windows SDK 6.1 Visual Studio 9 - COMPILER_VERSION=VS2008 - RC = $(MSSDK61)/bin/x64/rc - REBASE = $(MSSDK61)/bin/x64/rebase - else - ifeq ($(CC_MAJORVER), 16) - # This should be: CC_VER=16.00.30319.01 LINK_VER=9.00.30319.01 - REQUIRED_CC_VER = 16.00.30319.01 - REQUIRED_LINK_VER = 10.00.30319.01 - COMPILER_NAME=Microsoft Visual Studio 10 - COMPILER_VERSION=VS2010 - RC = $(MSSDK7)/bin/x64/rc - REBASE = $(MSSDK7)/bin/x64/rebase - else - # This will cause problems if ALT_COMPILER_PATH is defined to "" - # which is a directive to use the PATH. - REBASE = $(COMPILER_PATH)../REBASE - endif - endif - ifndef COMPILER_PATH - COMPILER_PATH := $(error COMPILER_PATH cannot be empty here) - endif - endif - ifndef COMPILER_VERSION - COMPILER_VERSION := $(error COMPILER_VERSION cannot be empty here) - endif - # Shared library generation flag - SHARED_LIBRARY_FLAG = -LD -endif - diff --git a/corba/make/common/shared/Compiler-sun.gmk b/corba/make/common/shared/Compiler-sun.gmk deleted file mode 100644 index 3e4e6879691..00000000000 --- a/corba/make/common/shared/Compiler-sun.gmk +++ /dev/null @@ -1,69 +0,0 @@ -# -# Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Sun Studio Compiler settings -# - -COMPILER_NAME=Sun Studio - -# Sun Studio Compiler settings specific to Solaris -ifeq ($(PLATFORM), solaris) - COMPILER_VERSION=SS12 - REQUIRED_CC_VER=5.9 - CC = $(COMPILER_PATH)cc - CPP = $(COMPILER_PATH)cc -E - CXX = $(COMPILER_PATH)CC - LINT = $(COMPILER_PATH)lint - # Option used to create a shared library - SHARED_LIBRARY_FLAG = -G -endif - -# Sun Studio Compiler settings specific to Linux -ifeq ($(PLATFORM), linux) - # This has not been tested - COMPILER_VERSION=SS12 - REQUIRED_CC_VER=5.9 - CC = $(COMPILER_PATH)cc - CPP = $(COMPILER_PATH)cc -E - CXX = $(COMPILER_PATH)CC - LINT = $(COMPILER_PATH)lint - # statically link libstdc++ before C++ ABI is stablized on Linux - STATIC_CXX = true - ifeq ($(STATIC_CXX),true) - # CC always dynamically links libstdc++, even we use "-Wl,-Bstatic -lstdc++" - # We need to use cc to statically link the C++ runtime. - CXX = $(COMPILER_PATH)cc - else - CXX = $(COMPILER_PATH)CC - endif - # Option used to create a shared library - SHARED_LIBRARY_FLAG = -G -endif - -# Get compiler version -_CC_VER :=$(shell $(CC) -V 2>&1 | $(HEAD) -n 1) -CC_VER :=$(call GetVersion,"$(_CC_VER)") - diff --git a/corba/make/common/shared/Compiler.gmk b/corba/make/common/shared/Compiler.gmk deleted file mode 100644 index 0d5945542d8..00000000000 --- a/corba/make/common/shared/Compiler.gmk +++ /dev/null @@ -1,47 +0,0 @@ -# -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# -# Compiler settings for all platforms and the default compiler for each. -# - -# Windows uses Microsoft compilers by default -ifeq ($(PLATFORM), windows) - override CC_VERSION = msvc -endif - -# Solaris uses Sun Studio compilers by default -ifeq ($(PLATFORM), solaris) - override CC_VERSION = sun -endif - -# Linux uses GNU compilers by default -ifeq ($(PLATFORM), linux) - override CC_VERSION = gcc -endif - -# Get the compiler specific settings -include $(BUILDDIR)/common/shared/Compiler-$(CC_VERSION).gmk - diff --git a/corba/make/common/shared/Defs-java.gmk b/corba/make/common/shared/Defs-java.gmk index 57e8642a52f..8d7531fe3e4 100644 --- a/corba/make/common/shared/Defs-java.gmk +++ b/corba/make/common/shared/Defs-java.gmk @@ -42,7 +42,7 @@ else endif # -# All java tools (javac, javah, and javadoc) run faster with certain java +# All java tools (javac and javadoc) run faster with certain java # options, this macro should be used with all these tools. # In particular, the client VM makes these tools run faster when # it's available. @@ -134,21 +134,14 @@ JAVACFLAGS += -encoding ascii JAVACFLAGS += -classpath $(BOOTDIR)/lib/tools.jar JAVACFLAGS += $(OTHER_JAVACFLAGS) -# Needed for javah -JAVAHFLAGS += -classpath $(CLASSBINDIR) - # Langtools ifdef LANGTOOLS_DIST JAVAC_JAR = $(LANGTOOLS_DIST)/bootstrap/lib/javac.jar - JAVAH_JAR = $(LANGTOOLS_DIST)/bootstrap/lib/javah.jar JAVADOC_JAR = $(LANGTOOLS_DIST)/bootstrap/lib/javadoc.jar DOCLETS_JAR = $(LANGTOOLS_DIST)/bootstrap/lib/doclets.jar JAVAC_CMD = $(BOOT_JAVA_CMD) \ "-Xbootclasspath/p:$(JAVAC_JAR)" \ -jar $(JAVAC_JAR) $(JAVACFLAGS) - JAVAH_CMD = $(BOOT_JAVA_CMD) \ - "-Xbootclasspath/p:$(JAVAH_JAR)$(CLASSPATH_SEPARATOR)$(JAVADOC_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)" \ - -jar $(JAVAH_JAR) $(JAVAHFLAGS) JAVADOC_CMD = $(BOOT_JAVA_CMD) \ "-Xbootclasspath/p:$(JAVADOC_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)$(CLASSPATH_SEPARATOR)$(DOCLETS_JAR)" \ -jar $(JAVADOC_JAR) @@ -156,8 +149,6 @@ else # If no explicit tools, use boot tools (add VM flags in this case) JAVAC_CMD = $(JAVA_TOOLS_DIR)/javac $(JAVAC_JVM_FLAGS) \ $(JAVACFLAGS) - JAVAH_CMD = $(JAVA_TOOLS_DIR)/javah \ - $(JAVAHFLAGS) JAVADOC_CMD = $(JAVA_TOOLS_DIR)/javadoc $(JAVA_TOOLS_FLAGS:%=-J%) endif diff --git a/corba/make/common/shared/Defs-linux.gmk b/corba/make/common/shared/Defs-linux.gmk index c9b931f6b08..9db85a39ba7 100644 --- a/corba/make/common/shared/Defs-linux.gmk +++ b/corba/make/common/shared/Defs-linux.gmk @@ -94,14 +94,6 @@ else JDK_DEVTOOLS_DIR =$(SLASH_JAVA)/devtools endif -# COMPILER_PATH: path to where the compiler and tools are installed. -# NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifneq "$(origin ALT_COMPILER_PATH)" "undefined" - COMPILER_PATH :=$(call PrefixPath,$(ALT_COMPILER_PATH)) -else - COMPILER_PATH =/usr/bin/ -endif - # DEVTOOLS_PATH: for other tools required for building (such as zip, etc.) # NOTE: Must end with / so that it could be empty, allowing PATH usage. ifneq "$(origin ALT_DEVTOOLS_PATH)" "undefined" diff --git a/corba/make/common/shared/Defs-solaris.gmk b/corba/make/common/shared/Defs-solaris.gmk index 61d218c635c..7f0abf6a790 100644 --- a/corba/make/common/shared/Defs-solaris.gmk +++ b/corba/make/common/shared/Defs-solaris.gmk @@ -86,24 +86,6 @@ else JDK_DEVTOOLS_DIR =$(SLASH_JAVA)/devtools endif -# COMPILER_PATH: path to where the compiler and tools are installed. -# NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifneq "$(origin ALT_COMPILER_PATH)" "undefined" - COMPILER_PATH :=$(call PrefixPath,$(ALT_COMPILER_PATH)) -else - # Careful here, COMPILER_VERSION may not be defined yet (see Compiler.gmk) - # If the place where we keep a set of Sun Studio compilers doesn't exist, - # try and use /opt/SUNWspro, the default location for the SS compilers. - # (DirExists checks for this path twice, an automount double check) - _SUNSTUDIO_SET_ROOT=$(JDK_DEVTOOLS_DIR)/$(ARCH_FAMILY)/SUNWspro - SUNSTUDIO_SET_ROOT:=$(call DirExists,$(_SUNSTUDIO_SET_ROOT),$(_SUNSTUDIO_SET_ROOT),) - ifneq ($(SUNSTUDIO_SET_ROOT),) - COMPILER_PATH =$(SUNSTUDIO_SET_ROOT)/$(COMPILER_VERSION)/bin/ - else - COMPILER_PATH =/opt/SUNWspro/bin/ - endif -endif - # DEVTOOLS_PATH: for other tools required for building (such as zip, etc.) # NOTE: Must end with / so that it could be empty, allowing PATH usage. ifneq "$(origin ALT_DEVTOOLS_PATH)" "undefined" diff --git a/corba/make/common/shared/Defs-windows.gmk b/corba/make/common/shared/Defs-windows.gmk index 41fcce6ce7b..559317a744e 100644 --- a/corba/make/common/shared/Defs-windows.gmk +++ b/corba/make/common/shared/Defs-windows.gmk @@ -31,7 +31,6 @@ # Level: Default is 3, 0 means none, 4 is the most but may be unreliable # Some makefiles may have set this to 0 to turn off warnings completely, # which also effectively creates a COMPILER_WARNINGS_FATAL=false situation. -# Program.gmk may turn this down to 2 (building .exe's). # Windows 64bit platforms are less likely to be warning free. # Historically, Windows 32bit builds should be mostly warning free. ifndef COMPILER_WARNING_LEVEL @@ -74,7 +73,7 @@ override INCREMENTAL_BUILD = false # The ALT values should never really have spaces or use \. # Suspect these environment variables to have spaces and/or \ characters: # SYSTEMROOT, SystemRoot, WINDIR, windir, PROGRAMFILES, ProgramFiles, -# MSTOOLS, Mstools, MSSDK, MSSdk, VC71COMNTOOLS, +# VC71COMNTOOLS, # MSVCDIR, MSVCDir. # So use $(subst \,/,) on them first adding quotes and placing them in # their own variable assigned with :=, then use FullPath. @@ -201,124 +200,6 @@ ifndef SHORTPROGRAMFILES export SHORTPROGRAMFILES endif -# Compilers, SDK, and Visual Studio (MSDEV) [32bit is different from 64bit] -ifeq ($(ARCH_DATA_MODEL), 32) - ifndef SHORTMSVCDIR - # Try looking in MSVCDIR or MSVCDir area first (set by vcvars32.bat) - ifdef MSVCDIR - xMSVCDIR :="$(subst \,/,$(MSVCDIR))" - SHORTMSVCDIR :=$(call FullPath,$(xMSVCDIR)) - else - ifdef MSVCDir - xMSVCDIR :="$(subst \,/,$(MSVCDir))" - SHORTMSVCDIR :=$(call FullPath,$(xMSVCDIR)) - else - ifneq ($(SHORTPROGRAMFILES),) - xMSVCDIR :="$(SHORTPROGRAMFILES)/Microsoft Visual Studio .NET 2003/Vc7" - SHORTMSVCDIR :=$(call FullPath,$(xMSVCDIR)) - endif - endif - endif - ifneq ($(subst MSDev98,OLDOLDOLD,$(SHORTMSVCDIR)),$(SHORTMSVCDIR)) - SHORTMSVCDIR := - endif - # If we still don't have it, look for VS100COMNTOOLS, setup by installer? - ifeq ($(SHORTMSVCDIR),) - ifdef VS100COMNTOOLS # /Common/Tools directory, use ../../Vc - xVS100COMNTOOLS :="$(subst \,/,$(VS100COMNTOOLS))" - _vs100tools :=$(call FullPath,$(xVS100COMNTOOLS)) - endif - ifneq ($(_vs100tools),) - SHORTMSVCDIR :=$(_vs100tools)/../../Vc - endif - endif - export SHORTMSVCDIR - # If we still don't have it, look for VS71COMNTOOLS, setup by installer? - ifeq ($(SHORTMSVCDIR),) - ifdef VS71COMNTOOLS # /Common/Tools directory, use ../../Vc7 - xVS71COMNTOOLS :="$(subst \,/,$(VS71COMNTOOLS))" - _vs71tools :=$(call FullPath,$(xVS71COMNTOOLS)) - endif - ifneq ($(_vs71tools),) - SHORTMSVCDIR :=$(_vs71tools)/../../Vc7 - endif - endif - export SHORTMSVCDIR - endif - ifneq ($(SHORTMSVCDIR),) - SHORTCOMPILERBIN :=$(SHORTMSVCDIR)/Bin - SHORTPSDK :=$(SHORTMSVCDIR)/PlatformSDK - export SHORTCOMPILERBIN - export SHORTPSDK - endif -endif - -# The Microsoft Platform SDK installed by itself -ifneq ($(SHORTPROGRAMFILES),) - ifndef SHORTPSDK - xPSDK :="$(SHORTPROGRAMFILES)/Microsoft Platform SDK" - SHORTPSDK :=$(call FullPath,$(xPSDK)) - ifeq ($(SHORTPSDK),) - xPSDK :="$(SHORTPROGRAMFILES)/Microsoft SDK" - SHORTPSDK :=$(call FullPath,$(xMSSDK)) - endif - export SHORTPSDK - endif -endif - -# If no SDK found yet, look in other places -ifndef SHORTPSDK - ifdef MSSDK - xMSSDK :="$(subst \,/,$(MSSDK))" - SHORTPSDK :=$(call FullPath,$(xMSSDK)) - else - ifdef MSSdk - xMSSDK :="$(subst \,/,$(MSSdk))" - SHORTPSDK :=$(call FullPath,$(xMSSDK)) - endif - endif - export SHORTPSDK -endif - -# Compilers for 64bit are from SDK -ifeq ($(ARCH_DATA_MODEL), 64) - ifndef SHORTCOMPILERBIN - ifdef VS100COMNTOOLS # /Common7/Tools directory, use ../../Vc - xVS100COMNTOOLS :="$(subst \,/,$(VS100COMNTOOLS))" - _vs100tools :=$(call FullPath,$(xVS100COMNTOOLS)) - endif - ifneq ($(_vs100tools),) - SHORTCOMPILERBIN :=$(_vs100tools)/../../Vc/bin/amd64 - xMSSDK70 :="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/" - MSSDK7 :=$(call FullPath,$(xMSSDK70)) - export MSSDK7 - else - xMSSDK61 :="C:/Program Files/Microsoft SDKs/Windows/v6.1/" - MSSDK61 :=$(call FullPath,$(xMSSDK61)) - xVS2008 :="C:/Program Files (x86)/Microsoft Visual Studio 9.0/" - _vs2008 :=$(call FullPath,$(xVS2008)) - ifneq ($(_vs2008),) - ifeq ($(ARCH), ia64) - SHORTCOMPILERBIN :=$(_vs2008)/VC/Bin/x86_ia64 - endif - ifeq ($(ARCH), amd64) - SHORTCOMPILERBIN :=$(_vs2008)/VC/Bin/$(ARCH) - endif - else - ifneq ($(SHORTPSDK),) - ifeq ($(ARCH), ia64) - SHORTCOMPILERBIN :=$(SHORTPSDK)/Bin/Win64 - endif - ifeq ($(ARCH), amd64) - SHORTCOMPILERBIN :=$(SHORTPSDK)/Bin/Win64/x86/$(ARCH) - endif - endif - endif - endif - export SHORTCOMPILERBIN - endif -endif - # Location on system where jdk installs might be ifneq ($(SHORTPROGRAMFILES),) USRJDKINSTANCES_PATH =$(SHORTPROGRAMFILES)/Java @@ -356,55 +237,6 @@ ifndef JDK_DEVTOOLS_DIR export JDK_DEVTOOLS_DIR endif -# COMPILER_PATH: path to where the compiler and tools are installed. -# NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifndef COMPILER_PATH - ifdef ALT_COMPILER_PATH - xALT_COMPILER_PATH :="$(subst \,/,$(ALT_COMPILER_PATH))" - fxALT_COMPILER_PATH :=$(call FullPath,$(xALT_COMPILER_PATH)) - COMPILER_PATH :=$(call PrefixPath,$(fxALT_COMPILER_PATH)) - else - COMPILER_PATH :=$(call PrefixPath,$(SHORTCOMPILERBIN)) - endif - COMPILER_PATH :=$(call AltCheckSpaces,COMPILER_PATH) - export COMPILER_PATH -endif - -# MSDEVTOOLS_PATH: path to where the additional MS Compiler tools are. -# NOTE: Must end with / so that it could be empty, allowing PATH usage. -ifndef MSDEVTOOLS_PATH - ifdef ALT_MSDEVTOOLS_PATH - xALT_MSDEVTOOLS_PATH :="$(subst \,/,$(ALT_MSDEVTOOLS_PATH))" - fxALT_MSDEVTOOLS_PATH :=$(call FullPath,$(xALT_MSDEVTOOLS_PATH)) - MSDEVTOOLS_PATH :=$(call PrefixPath,$(fxALT_MSDEVTOOLS_PATH)) - else - ifeq ($(ARCH_DATA_MODEL), 64) - ifdef MSTOOLS - xMSTOOLS :="$(subst \,/,$(MSTOOLS))" - _ms_tools :=$(call FullPath,$(xMSTOOLS)) - else - ifdef Mstools - xMSTOOLS :="$(subst \,/,$(Mstools))" - _ms_tools :=$(call FullPath,$(xMSTOOLS)) - else - _ms_tools := - endif - endif - ifneq ($(_ms_tools),) - _ms_tools_bin :=$(_ms_tools)/Bin - else - # Assumes compiler bin is .../Bin/win64/x86/AMD64, rc.exe is 3 levels up - _ms_tools_bin :=$(SHORTCOMPILERBIN)/../../.. - endif - else - _ms_tools_bin :=$(SHORTCOMPILERBIN) - endif - MSDEVTOOLS_PATH :=$(call PrefixPath,$(_ms_tools_bin)) - endif - MSDEVTOOLS_PATH:=$(call AltCheckSpaces,MSDEVTOOLS_PATH) - export MSDEVTOOLS_PATH -endif - # DEVTOOLS_PATH: for other tools required for building (such as zip, etc.) # NOTE: Must end with / so that it could be empty, allowing PATH usage. ifndef DEVTOOLS_PATH diff --git a/corba/make/common/shared/Defs.gmk b/corba/make/common/shared/Defs.gmk index 1875bd95fd7..af1456bab97 100644 --- a/corba/make/common/shared/Defs.gmk +++ b/corba/make/common/shared/Defs.gmk @@ -51,7 +51,7 @@ # Get shared system utilities macros defined include $(BUILDDIR)/common/shared/Defs-utils.gmk -# Assumes ARCH, PLATFORM, ARCH_VM_SUBDIR, etc. have been defined. +# Assumes ARCH, PLATFORM, etc. have been defined. # Simple pwd path define PwdPath @@ -157,7 +157,6 @@ endef _check_values:=\ $(call CheckValue,ARCH,),\ $(call CheckValue,ARCH_DATA_MODEL,),\ -$(call CheckValue,ARCH_VM_SUBDIR,),\ $(call CheckValue,VARIANT,),\ $(call CheckValue,PLATFORM,) @@ -194,21 +193,15 @@ endif # can be OPT or DBG, default is OPT # Determine the extra pattern to add to the release name for debug/fastdebug. # Determine the JDK_IMPORT_VARIANT, so we get the right VM files copied over. -# Determine suffix for obj directory or OBJDIR, for .o files. -# (by keeping .o files separate, just .o files, they don't clobber each -# other, however, the library files will clobber each other). # ifeq ($(VARIANT), DBG) BUILD_VARIANT_RELEASE=-debug - OBJDIRNAME_SUFFIX=_g else BUILD_VARIANT_RELEASE= - OBJDIRNAME_SUFFIX= endif ifeq ($(FASTDEBUG), true) VARIANT=DBG BUILD_VARIANT_RELEASE=-fastdebug - OBJDIRNAME_SUFFIX=_gO _JDK_IMPORT_VARIANT=/fastdebug endif @@ -330,6 +323,4 @@ BINDIR = $(OUTPUTDIR)/bin$(ISA_DIR) # Absolute path to output directory ABS_OUTPUTDIR:=$(call FullPath,$(OUTPUTDIR)) -# Get shared compiler settings -include $(BUILDDIR)/common/shared/Compiler.gmk diff --git a/corba/make/common/shared/Platform.gmk b/corba/make/common/shared/Platform.gmk index edaf8582fde..e1bb4466531 100644 --- a/corba/make/common/shared/Platform.gmk +++ b/corba/make/common/shared/Platform.gmk @@ -58,19 +58,10 @@ PLATFORM_SHARED=done # ARCH sparc, sparcv9, i586, amd64, or ia64 # ARCH_FAMILY sparc or i586 # ARCHPROP sparc or x86 -# ARCH_VM_SUBDIR jre/bin, jre/lib/sparc, etc. -# LIBARCH sparc, sparcv9, i386, amd64, or ia64 # DEV_NULL destination of /dev/null, NUL or /dev/NULL # CLASSPATH_SEPARATOR separator in classpath, ; or : -# LIB_PREFIX dynamic or static library prefix, lib or empty -# LIB_SUFFIX static library file suffix, .lib or .a? -# LIBRARY_SUFFIX dynamic library file suffix, .dll or .so -# OBJECT_SUFFIX object file suffix, .o or .obj -# EXE_SUFFIX executable file suffix, .exe or empty # BUNDLE_FILE_SUFFIX suffix for bundles: .tar or .tar.gz # ISA_DIR solaris only: /sparcv9 or /amd64 -# LIBARCH32 solaris only: sparc or i386 -# LIBARCH64 solaris only: sparcv9 or amd64 # REQUIRED_WINDOWS_NAME windows only: basic name of windows # REQUIRED_WINDOWS_VERSION windows only: specific version of windows # USING_CYGWIN windows only: true or false @@ -129,7 +120,6 @@ ifeq ($(SYSTEM_UNAME), SunOS) # Need to maintain the jre/lib/i386 location for 32-bit Intel ifeq ($(ARCH), i586) ARCH_FAMILY = $(ARCH) - LIBARCH = i386 # Value of Java os.arch property ARCHPROP = x86 else @@ -138,17 +128,8 @@ ifeq ($(SYSTEM_UNAME), SunOS) else ARCH_FAMILY = sparc endif - LIBARCH = $(ARCH) # Value of Java os.arch property - ARCHPROP = $(LIBARCH) - endif - # The two LIBARCH names - ifeq ($(ARCH_FAMILY), sparc) - LIBARCH32 = sparc - LIBARCH64 = sparcv9 - else - LIBARCH32 = i386 - LIBARCH64 = amd64 + ARCHPROP = $(ARCH) endif # Suffix for file bundles used in previous release BUNDLE_FILE_SUFFIX=.tar @@ -218,16 +199,12 @@ ifeq ($(SYSTEM_UNAME), Linux) endif endif - # Need to maintain the jre/lib/i386 location for 32-bit Intel ifeq ($(ARCH), i586) - LIBARCH = i386 + ARCHPROP = i386 else - LIBARCH = $(ARCH) + ARCHPROP = $(ARCH) endif - # Value of Java os.arch property - ARCHPROP = $(LIBARCH) - # Suffix for file bundles used in previous release BUNDLE_FILE_SUFFIX=.tar.gz # Minimum disk space needed as determined by running 'du -sk' on @@ -303,9 +280,7 @@ ifeq ($(PLATFORM), windows) endif endif export ARCH_DATA_MODEL - # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel ARCH=i586 - LIBARCH=i386 # Value of Java os.arch property ARCHPROP=x86 REQUIRED_WINDOWS_NAME=Windows Professional 2000 @@ -323,9 +298,8 @@ ifeq ($(PLATFORM), windows) ARCH=ia64 endif endif - LIBARCH=$(ARCH) # Value of Java os.arch property - ARCHPROP=$(LIBARCH) + ARCHPROP=$(ARCH) endif ARCH_FAMILY = $(ARCH) # Where is unwanted output to be delivered? @@ -337,14 +311,6 @@ ifeq ($(PLATFORM), windows) export DEV_NULL # Classpath separator CLASSPATH_SEPARATOR = ; - # The suffix used for object file (.o for unix .obj for windows) - OBJECT_SUFFIX = obj - # The suffix applied to executables (.exe for windows, nothing for solaris) - EXE_SUFFIX = .exe - # The prefix applied to library files (lib for solaris, nothing for windows) - LIB_PREFIX= - LIBRARY_SUFFIX = dll - LIB_SUFFIX = lib # User name determination (set _USER) ifndef USER ifdef USERNAME @@ -359,8 +325,6 @@ ifeq ($(PLATFORM), windows) else _USER:=$(USER) endif - # Location of client/server directories - ARCH_VM_SUBDIR=jre/bin # Suffix for file bundles used in previous release BUNDLE_FILE_SUFFIX=.tar # Minimum disk space needed as determined by running 'du -sk' on @@ -430,16 +394,6 @@ ifneq ($(PLATFORM), windows) export DEV_NULL # Character used between entries in classpath CLASSPATH_SEPARATOR = : - # suffix used for object file (.o for unix .obj for windows) - OBJECT_SUFFIX = o - # The suffix applied to runtime libraries - LIBRARY_SUFFIX = so - # The suffix applied to link libraries - LIB_SUFFIX = so - # The suffix applied to executables (.exe for windows, nothing for solaris) - EXE_SUFFIX = - # The prefix applied to library files (lib for solaris, nothing for windows) - LIB_PREFIX = lib # User name determination (set _USER) ifndef USER ifdef LOGNAME @@ -450,8 +404,6 @@ ifneq ($(PLATFORM), windows) else _USER:=$(USER) endif - # Location of client/server directories - ARCH_VM_SUBDIR=jre/lib/$(LIBARCH) endif # If blanks in the username, use the first 4 words and pack them together diff --git a/corba/make/org/omg/idl/Makefile b/corba/make/org/omg/idl/Makefile index 27a8cfa897f..87ad9db55a9 100644 --- a/corba/make/org/omg/idl/Makefile +++ b/corba/make/org/omg/idl/Makefile @@ -32,12 +32,6 @@ PACKAGE = com.sun.tools.corba.se.idl PRODUCT = sun include $(BUILDDIR)/common/Defs.gmk -# This program must contain a manifest that defines the execution level -# needed to follow standard Vista User Access Control Guidelines -# This must be set before Program.gmk is included -# -BUILD_MANIFEST=true - # # Files # From 7f6ca92673374a771255b14d8c4e6fedac702891 Mon Sep 17 00:00:00 2001 From: Kelly O'Hair Date: Mon, 30 Aug 2010 16:00:46 -0700 Subject: [PATCH 018/128] 6962317: jdk7 jaxws source bundle still needs rebranding 6955300: Missing files in the jaf source bundle Reviewed-by: ramap --- jaxws/jaxws.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/jaxws/jaxws.properties b/jaxws/jaxws.properties index 6e8e3a3b94e..3314617b2d4 100644 --- a/jaxws/jaxws.properties +++ b/jaxws/jaxws.properties @@ -25,15 +25,15 @@ drops.master.copy.base=${drops.dir} -jaxws_src.bundle.name=jdk7-jaxws-b100.zip -jaxws_src.bundle.md5.checksum=e4fea255c6222b118bb1d0d3054d36e1 +jaxws_src.bundle.name= jdk7-jaxws2_2-2010_08_19.zip +jaxws_src.bundle.md5.checksum=8775ccefd3b4fa2dde5155ec4b7e4ceb jaxws_src.master.bundle.dir=${drops.master.copy.base} -jaxws_src.master.bundle.url.base=https://jax-ws.dev.java.net/files/documents/4202/150896 +jaxws_src.master.bundle.url.base=https://jax-ws.dev.java.net/files/documents/4202/152532 -jaf_src.bundle.name=jdk7-jaf-2009_08_28.zip -jaf_src.bundle.md5.checksum=eb8cb7a4a7f14e211fbe2354878a2472 +jaf_src.bundle.name=jdk7-jaf-2010_08_19.zip +jaf_src.bundle.md5.checksum=18d15dfd71117daadb332af003d08212 jaf_src.master.bundle.dir=${drops.master.copy.base} -jaf_src.master.bundle.url.base=http://kenai.com/projects/jdk7-drops/downloads/download +jaf_src.master.bundle.url.base=https://jax-ws.dev.java.net/files/documents/4202/152336 #jaxws_tests.bundle.name=jdk7-jaxws-tests-2009_08_28.zip #jaxws_tests.master.bundle.dir=${drops.master.copy.base} From 0930f81131936de2e4c06660f3e84dfee44377dc Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Mon, 30 Aug 2010 18:03:35 -0700 Subject: [PATCH 019/128] 6403465: javac should defer diagnostics until it can be determined they are persistent Reviewed-by: mcimadamore, darcy --- .../com/sun/tools/javac/comp/Attr.java | 5 +- .../sun/tools/javac/main/JavaCompiler.java | 38 ++- .../JavacProcessingEnvironment.java | 42 +++- .../classes/com/sun/tools/javac/util/Log.java | 34 ++- .../javac/processing/6430209/b6341534.java | 9 +- .../processing/errors/TestSuppression.java | 232 ++++++++++++++++++ 6 files changed, 335 insertions(+), 25 deletions(-) create mode 100644 langtools/test/tools/javac/processing/errors/TestSuppression.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index aa58f1b0a9b..12eda0898ea 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -578,6 +578,8 @@ public class Attr extends JCTree.Visitor { boolean classExpected, boolean interfaceExpected, boolean checkExtensible) { + if (t.isErroneous()) + return t; if (t.tag == TYPEVAR && !classExpected && !interfaceExpected) { // check that type variable is already visible if (t.getUpperBound() == null) { @@ -595,7 +597,7 @@ public class Attr extends JCTree.Visitor { } else if (checkExtensible && classExpected && (t.tsym.flags() & INTERFACE) != 0) { - log.error(tree.pos(), "no.intf.expected.here"); + log.error(tree.pos(), "no.intf.expected.here"); return types.createErrorType(t); } if (checkExtensible && @@ -2845,7 +2847,6 @@ public class Attr extends JCTree.Visitor { if (tree.bounds.tail.nonEmpty()) { log.error(tree.bounds.tail.head.pos(), "type.var.may.not.be.followed.by.other.bounds"); - log.unrecoverableError = true; tree.bounds = List.of(tree.bounds.head); a.bound = bs.head; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java index c3768fe05f5..2d3e923b80a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -59,6 +59,7 @@ import com.sun.tools.javac.processing.*; import javax.annotation.processing.Processor; import static javax.tools.StandardLocation.CLASS_OUTPUT; +import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*; import static com.sun.tools.javac.util.ListBuffer.lb; // TEMP, until we have a more efficient way to save doc comment info @@ -579,10 +580,8 @@ public class JavaCompiler implements ClassReader.SourceCompleter { TaskEvent e = new TaskEvent(TaskEvent.Kind.PARSE, filename); taskListener.started(e); } - int initialErrorCount = log.nerrors; Parser parser = parserFactory.newParser(content, keepComments(), genEndPos, lineDebugInfo); tree = parser.parseCompilationUnit(); - log.unrecoverableError |= (log.nerrors > initialErrorCount); if (verbose) { printVerbose("parsing.done", Long.toString(elapsed(msec))); } @@ -967,8 +966,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { keepComments = true; if (taskListener != null) taskListener.started(new TaskEvent(TaskEvent.Kind.ANNOTATION_PROCESSING)); - - + log.deferDiagnostics = true; } else { // free resources procEnvImpl.close(); } @@ -985,15 +983,23 @@ public class JavaCompiler implements ClassReader.SourceCompleter { * @param roots a list of compilation units * @return an instance of the compiler in which to complete the compilation */ + // Implementation note: when this method is called, log.deferredDiagnostics + // will have been set true by initProcessAnnotations, meaning that any diagnostics + // that are reported will go into the log.deferredDiagnostics queue. + // By the time this method exits, log.deferDiagnostics must be set back to false, + // and all deferredDiagnostics must have been handled: i.e. either reported + // or determined to be transient, and therefore suppressed. public JavaCompiler processAnnotations(List roots, List classnames) { if (shouldStop(CompileState.PROCESS)) { // Errors were encountered. - // If log.unrecoverableError is set, the errors were parse errors + // Unless all the errors are resolve errors, the errors were parse errors // or other errors during enter which cannot be fixed by running // any annotation processors. - if (log.unrecoverableError) + if (unrecoverableError()) { + log.reportDeferredDiagnostics(); return this; + } } // ASSERT: processAnnotations and procEnvImpl should have been set up by @@ -1015,6 +1021,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { log.error("proc.no.explicit.annotation.processing.requested", classnames); } + log.reportDeferredDiagnostics(); return this; // continue regular compilation } @@ -1027,6 +1034,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { if (!explicitAnnotationProcessingRequested()) { log.error("proc.no.explicit.annotation.processing.requested", classnames); + log.reportDeferredDiagnostics(); return this; // TODO: Will this halt compilation? } else { boolean errors = false; @@ -1041,7 +1049,6 @@ public class JavaCompiler implements ClassReader.SourceCompleter { if (sym.kind == Kinds.PCK) sym.complete(); if (sym.exists()) { - Name name = names.fromString(nameStr); if (sym.kind == Kinds.PCK) pckSymbols = pckSymbols.prepend((PackageSymbol)sym); else @@ -1057,25 +1064,38 @@ public class JavaCompiler implements ClassReader.SourceCompleter { continue; } } - if (errors) + if (errors) { + log.reportDeferredDiagnostics(); return this; + } } } try { JavaCompiler c = procEnvImpl.doProcessing(context, roots, classSymbols, pckSymbols); if (c != this) annotationProcessingOccurred = c.annotationProcessingOccurred = true; + // doProcessing will have handled deferred diagnostics + assert c.log.deferDiagnostics == false; + assert c.log.deferredDiagnostics.size() == 0; return c; } finally { procEnvImpl.close(); } } catch (CompletionFailure ex) { log.error("cant.access", ex.sym, ex.getDetailValue()); + log.reportDeferredDiagnostics(); return this; - } } + private boolean unrecoverableError() { + for (JCDiagnostic d: log.deferredDiagnostics) { + if (d.getKind() == JCDiagnostic.Kind.ERROR && !d.isFlagSet(RESOLVE_ERROR)) + return true; + } + return false; + } + boolean explicitAnnotationProcessingRequested() { Options options = Options.instance(context); return diff --git a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java index e4318f513cf..f6623ef9028 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java @@ -77,6 +77,7 @@ import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Options; import static javax.tools.StandardLocation.*; +import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*; /** * Objects of this class hold and manage the state needed to support @@ -97,6 +98,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea private final boolean procOnly; private final boolean fatalErrors; private final boolean werror; + private final boolean showResolveErrors; private boolean foundTypeProcessors; private final JavacFiler filer; @@ -164,6 +166,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea procOnly = options.get("-proc:only") != null || options.get("-Xprint") != null; fatalErrors = options.get("fatalEnterError") != null; + showResolveErrors = options.get("showResolveErrors") != null; werror = options.get("-Werror") != null; platformAnnotations = initPlatformAnnotations(); foundTypeProcessors = false; @@ -825,6 +828,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea compiler = JavaCompiler.instance(context); log = Log.instance(context); + log.deferDiagnostics = true; // the following is for the benefit of JavacProcessingEnvironment.getContext() JavacProcessingEnvironment.this.context = context; @@ -924,10 +928,24 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea /** Return whether or not an unrecoverable error has occurred. */ boolean unrecoverableError() { - return log.unrecoverableError - || messager.errorRaised() - || (werror && log.nwarnings > 0) - || (fatalErrors && log.nerrors > 0); + if (messager.errorRaised()) + return true; + + for (JCDiagnostic d: log.deferredDiagnostics) { + switch (d.getKind()) { + case WARNING: + if (werror) + return true; + break; + + case ERROR: + if (fatalErrors || !d.isFlagSet(RESOLVE_ERROR)) + return true; + break; + } + } + + return false; } /** Find the set of annotations present in the set of top level @@ -943,7 +961,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } /** Enter a set of generated class files. */ - List enterClassFiles(Map classFiles) { + private List enterClassFiles(Map classFiles) { ClassReader reader = ClassReader.instance(context); Names names = Names.instance(context); List list = List.nil(); @@ -970,7 +988,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } /** Enter a set of syntax trees. */ - void enterTrees(List roots) { + private void enterTrees(List roots) { compiler.enterTrees(roots); } @@ -1000,6 +1018,15 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } } + void showDiagnostics(boolean showAll) { + Set kinds = EnumSet.allOf(JCDiagnostic.Kind.class); + if (!showAll) { + // suppress errors, which are all presumed to be transient resolve errors + kinds.remove(JCDiagnostic.Kind.ERROR); + } + log.reportDeferredDiagnostics(kinds); + } + /** Update the processing state for the current context. */ private void updateProcessingState() { filer.newRound(context); @@ -1111,6 +1138,8 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea errorStatus = round.unrecoverableError(); moreToDo = moreToDo(); + round.showDiagnostics(errorStatus || showResolveErrors); + // Set up next round. // Copy mutable collections returned from filer. round = round.next( @@ -1125,6 +1154,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea // run last round round.run(true, errorStatus); + round.showDiagnostics(true); filer.warnIfUnclosedFiles(); warnIfUnmatchedOptions(); diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java index 66d5e947ab2..0ffdc1a6ac0 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java @@ -27,8 +27,10 @@ package com.sun.tools.javac.util; import java.io.*; import java.util.Arrays; +import java.util.EnumSet; import java.util.HashSet; import java.util.Map; +import java.util.Queue; import java.util.Set; import javax.tools.DiagnosticListener; import javax.tools.JavaFileObject; @@ -110,6 +112,12 @@ public class Log extends AbstractLog { */ private JavacMessages messages; + /** + * Deferred diagnostics + */ + public boolean deferDiagnostics; + public Queue deferredDiagnostics = new ListBuffer(); + /** Construct a log with given I/O redirections. */ @Deprecated @@ -204,12 +212,6 @@ public class Log extends AbstractLog { */ public int nwarnings = 0; - /** - * Whether or not an unrecoverable error has been seen. - * Unrecoverable errors prevent subsequent annotation processing. - */ - public boolean unrecoverableError; - /** A set of all errors generated so far. This is used to avoid printing an * error message more than once. For each error, a pair consisting of the * source file name and source code position of the error is added to the set. @@ -347,12 +349,32 @@ public class Log extends AbstractLog { nwarnings++; } + /** Report all deferred diagnostics, and clear the deferDiagnostics flag. */ + public void reportDeferredDiagnostics() { + reportDeferredDiagnostics(EnumSet.allOf(JCDiagnostic.Kind.class)); + } + + /** Report selected deferred diagnostics, and clear the deferDiagnostics flag. */ + public void reportDeferredDiagnostics(Set kinds) { + deferDiagnostics = false; + JCDiagnostic d; + while ((d = deferredDiagnostics.poll()) != null) { + if (kinds.contains(d.getKind())) + report(d); + } + } + /** * Common diagnostic handling. * The diagnostic is counted, and depending on the options and how many diagnostics have been * reported so far, the diagnostic may be handed off to writeDiagnostic. */ public void report(JCDiagnostic diagnostic) { + if (deferDiagnostics) { + deferredDiagnostics.add(diagnostic); + return; + } + if (expectDiagKeys != null) expectDiagKeys.remove(diagnostic.getCode()); diff --git a/langtools/test/tools/javac/processing/6430209/b6341534.java b/langtools/test/tools/javac/processing/6430209/b6341534.java index 635664704c5..cc52af24a39 100644 --- a/langtools/test/tools/javac/processing/6430209/b6341534.java +++ b/langtools/test/tools/javac/processing/6430209/b6341534.java @@ -51,7 +51,8 @@ public class b6341534 extends AbstractProcessor { try { PackageElement PE = E.getPackageElement("dir1"); List LEE = PE.getEnclosedElements(); /* <=This line elicits the error message. */ - for(Element e : LEE) System.out.println("found " + e.toString() + " in dir1."); + for(Element e : LEE) + System.out.println("found " + e.toString() + " in dir1."); } catch(NullPointerException npe) { msgr.printMessage(ERROR,npe.toString()); @@ -59,7 +60,11 @@ public class b6341534 extends AbstractProcessor { return false; } } - if( renv.errorRaised() ) { msgr.printMessage(ERROR, "FAILED");} + // on round 1, expect errorRaised == false && processingOver == false + // on round 2, expect errorRaised == true && processingOver == true + if( renv.errorRaised() != renv.processingOver()) { + msgr.printMessage(ERROR, "FAILED"); + } return true; } diff --git a/langtools/test/tools/javac/processing/errors/TestSuppression.java b/langtools/test/tools/javac/processing/errors/TestSuppression.java new file mode 100644 index 00000000000..c793d2d221a --- /dev/null +++ b/langtools/test/tools/javac/processing/errors/TestSuppression.java @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6403465 + * @summary javac should defer diagnostics until it can be determined they are persistent + */ + +import java.io.*; +import java.util.*; +import javax.annotation.processing.*; +import javax.lang.model.*; +import javax.lang.model.element.TypeElement; +import javax.tools.*; + +import com.sun.source.util.JavacTask; +import com.sun.tools.javac.api.JavacTool; +import com.sun.tools.javac.util.JCDiagnostic; + +import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*; + + +public class TestSuppression { + public static void main(String... args) throws Exception { + new TestSuppression().run(args); + } + + enum WarningKind { NO, YES }; + + String[] cases = { + // missing class C + "class X { C c; }", + "class X { C foo() { return null; } }", + "class X { void foo(C c) { } }", + "class X extends C { }", + "class X { }", + // missing interface I + "class X implements I { }", + "interface X extends I { }", + // missing exception E + "class X { void m() throws E { } }", + // missing method m + "class X extends C { int i = m(); }", + // missing field f + "class X extends C { int i = f; }" + }; + + void run(String... args) throws Exception { + for (String c: cases) { + for (WarningKind wk: WarningKind.values()) { + for (int g = 1; g <= 3; g++) { + try { + test(c, wk, g); + } catch (Throwable t) { + error("caught: " + t); + } + if (errors > 0) throw new AssertionError(); + } + } + } + + System.err.println(count + " test cases"); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + void test(String src, WarningKind wk, int gen) throws Exception { + count++; + System.err.println("Test " + count + ": wk:" + wk + " gen:" + gen + " src:" +src); + + File testDir = new File("test" + count); + File srcDir = createDir(testDir, "src"); + File gensrcDir = createDir(testDir, "gensrc"); + File classesDir = createDir(testDir, "classes"); + + File x = writeFile(new File(srcDir, "X.java"), src); + + DiagListener dl = new DiagListener(); + JavacTool tool = JavacTool.create(); + StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null); + fm.setLocation(StandardLocation.CLASS_PATH, + Arrays.asList(classesDir, new File(System.getProperty("test.classes")))); + fm.setLocation(StandardLocation.CLASS_OUTPUT, Collections.singleton(classesDir)); + fm.setLocation(StandardLocation.SOURCE_OUTPUT, Collections.singleton(gensrcDir)); + List args = new ArrayList(); +// args.add("-XprintProcessorInfo"); + args.add("-XprintRounds"); + args.add("-Agen=" + gen); + if (wk == WarningKind.YES) + args.add("-Xlint:serial"); + Iterable files = fm.getJavaFileObjects(x); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + JavacTask task = tool.getTask(pw, fm, dl, args, null, files); + task.setProcessors(Arrays.asList(new AnnoProc())); + boolean ok = task.call(); + pw.close(); + + System.err.println("ok:" + ok + " diags:" + dl.counts); + if (sw.toString().length() > 0) { + System.err.println("output:\n" + sw.toString()); + } + + for (Diagnostic.Kind dk: Diagnostic.Kind.values()) { + Integer v = dl.counts.get(dk); + int found = (v == null) ? 0 : v; + int expect = (dk == Diagnostic.Kind.WARNING && wk == WarningKind.YES) ? gen : 0; + if (found != expect) { + error("Unexpected value for " + dk + ": expected: " + expect + " found: " + found); + } + } + + System.err.println(); + } + + File createDir(File parent, String name) { + File dir = new File(parent, name); + dir.mkdirs(); + return dir; + } + + File writeFile(File f, String content) throws IOException { + FileWriter out = new FileWriter(f); + try { + out.write(content); + } finally { + out.close(); + } + return f; + } + + void add(List list, T... values) { + for (T v: values) + list.add(v); + } + + void error(String msg) { + System.err.println("Error: " + msg); + errors++; + } + + int count; + int errors; + + static class DiagListener implements DiagnosticListener { + int total; + Map counts = new TreeMap(); + + public void report(Diagnostic diagnostic) { + System.err.println((++total) + ": " + + "resolveError:" + isResolveError((JCDiagnostic) diagnostic) + "\n" + + diagnostic); + Diagnostic.Kind dk = diagnostic.getKind(); + Integer c = counts.get(dk); + counts.put(dk, (c == null ? 1 : c + 1)); + } + + private static boolean isResolveError(JCDiagnostic d) { + return d.isFlagSet(RESOLVE_ERROR); + } + } + + @SupportedAnnotationTypes("*") + @SupportedOptions("gen") + public static class AnnoProc extends AbstractProcessor { + Filer f; + Messager m; + int gen; + + @Override + public void init(ProcessingEnvironment processingEnv) { + f = processingEnv.getFiler(); + m = processingEnv.getMessager(); + Map options = processingEnv.getOptions(); + gen = Integer.parseInt(options.get("gen")); + } + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + round++; + if (round < gen) + writeSource("Dummy" + round, "class Dummy" + round + " extends java.util.ArrayList{ }"); + else if (round == gen) { + writeSource("C", "class C { int f; int m() { return 0; } }"); + writeSource("I", "interface I { }"); + writeSource("E", "class E extends Exception { }"); + } + return true; + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } + + private void writeSource(String name, String text) { + try { + JavaFileObject fo = f.createSourceFile(name); + Writer out = fo.openWriter(); + out.write(text); + out.close(); + } catch (IOException e) { + m.printMessage(Diagnostic.Kind.ERROR, e.toString()); + } + } + + int round = 0; + } +} From 41e1560d14f090c0c53e2cd8a96b0b2787d93c53 Mon Sep 17 00:00:00 2001 From: Andrei Dmitriev Date: Tue, 31 Aug 2010 15:05:09 +0400 Subject: [PATCH 020/128] 6480547: REG: bug 4118621 which got Integrated in 1.1.8 fails in mustang from b25 onwards 6808185: test/closed/java/awt/Menu/NullMenuLabelTest crashes Reviewed-by: dcherepanov --- .../native/sun/windows/awt_MenuItem.cpp | 5 ++ .../native/sun/windows/awt_TextComponent.h | 2 - .../native/sun/windows/awt_TextField.cpp | 52 ++++++++++++++++--- .../native/sun/windows/awt_TextField.h | 9 +++- .../NullMenuLabelTest/NullMenuLabelTest.java | 26 ++++++++++ .../ScrollSelectionTest.java | 11 ++-- .../SpuriousExitEnter_3.java | 1 + 7 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 jdk/test/java/awt/Menu/NullMenuLabelTest/NullMenuLabelTest.java diff --git a/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp b/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp index 67b2fa262a8..6ed2a73d6af 100644 --- a/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp +++ b/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp @@ -794,6 +794,11 @@ BOOL AwtMenuItem::IsSeparator() { jobject jitem = GetTarget(env); jstring label = (jstring)(env)->GetObjectField(jitem, AwtMenuItem::labelID); + if (label == NULL) { + env->DeleteLocalRef(label); + env->DeleteLocalRef(jitem); + return FALSE; //separator must has '-' as label. + } LPCWSTR labelW = JNU_GetStringPlatformChars(env, label, NULL); BOOL isSeparator = (labelW && (wcscmp(labelW, L"-") == 0)); JNU_ReleaseStringPlatformChars(env, label, labelW); diff --git a/jdk/src/windows/native/sun/windows/awt_TextComponent.h b/jdk/src/windows/native/sun/windows/awt_TextComponent.h index 3a993742d11..7581c5c7aae 100644 --- a/jdk/src/windows/native/sun/windows/awt_TextComponent.h +++ b/jdk/src/windows/native/sun/windows/awt_TextComponent.h @@ -113,8 +113,6 @@ public: // Used to prevent untrusted code from synthesizing a WM_PASTE message // by posting a -V KeyEvent BOOL m_synthetic; - virtual void EditSetSel(CHARRANGE &cr) = 0; - virtual void EditGetSel(CHARRANGE &cr) = 0; virtual LONG EditGetCharFromPos(POINT& pt) = 0; private: diff --git a/jdk/src/windows/native/sun/windows/awt_TextField.cpp b/jdk/src/windows/native/sun/windows/awt_TextField.cpp index 94e8baca1b2..8f72dc06b56 100644 --- a/jdk/src/windows/native/sun/windows/awt_TextField.cpp +++ b/jdk/src/windows/native/sun/windows/awt_TextField.cpp @@ -41,7 +41,9 @@ struct SetEchoCharStruct { * AwtTextField methods */ -AwtTextField::AwtTextField() { +AwtTextField::AwtTextField() + : m_initialRescrollFlag( true ) +{ } /* Create a new AwtTextField object and window. */ @@ -116,10 +118,6 @@ void AwtTextField::EditSetSel(CHARRANGE &cr) { SendMessage(EM_SETSEL, cr.cpMin, cr.cpMax); } -void AwtTextField::EditGetSel(CHARRANGE &cr) { - SendMessage(EM_SETSEL, reinterpret_cast(&cr.cpMin), reinterpret_cast(&cr.cpMax)); -} - LONG AwtTextField::EditGetCharFromPos(POINT& pt) { return static_cast(SendMessage(EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y))); } @@ -153,11 +151,9 @@ AwtTextField::HandleEvent(MSG *msg, BOOL synthetic) * The workaround also allows us to implement synthetic focus mechanism. */ if (IsFocusingMouseMessage(msg)) { - CHARRANGE cr; LONG lCurPos = EditGetCharFromPos(msg->pt); - EditGetSel(cr); /* * NOTE: Plain EDIT control always clears selection on mouse * button press. We are clearing the current selection only if @@ -174,6 +170,7 @@ AwtTextField::HandleEvent(MSG *msg, BOOL synthetic) SetStartSelectionPos(lCurPos); SetEndSelectionPos(lCurPos); } + CHARRANGE cr; cr.cpMin = GetStartSelectionPos(); cr.cpMax = GetEndSelectionPos(); EditSetSel(cr); @@ -310,6 +307,47 @@ ret: delete secs; } +void AwtTextField::Reshape(int x, int y, int w, int h) +{ + AwtTextComponent::Reshape( x, y, w, h ); + + // Another option would be to call this + // after WM_SIZE notification is handled + initialRescroll(); +} + + +// Windows' Edit control features: +// (i) if text selection is set while control's width or height is 0, +// text is scrolled oddly. +// (ii) if control's size is changed, text seems never be automatically +// rescrolled. +// +// This method is designed for the following scenario: AWT spawns Edit +// control with 0x0 dimensions, then sets text selection, then resizes the +// control (couple of times). This might cause text appear undesirably scrolled. +// So we reset/set selection again to rescroll text. (see also CR 6480547) +void AwtTextField::initialRescroll() +{ + if( ! m_initialRescrollFlag ) { + return; + } + + ::RECT r; + BOOL ok = ::GetClientRect( GetHWnd(), &r ); + if( ! ok || r.right==0 || r.bottom==0 ) { + return; + } + + m_initialRescrollFlag = false; + + DWORD start, end; + SendMessage( EM_GETSEL, (WPARAM)&start, (LPARAM)&end ); + SendMessage( EM_SETSEL, (WPARAM)0, (LPARAM)0 ); + SendMessage( EM_SETSEL, (WPARAM)start, (LPARAM)end ); +} + + /************************************************************************ * WTextFieldPeer native methods */ diff --git a/jdk/src/windows/native/sun/windows/awt_TextField.h b/jdk/src/windows/native/sun/windows/awt_TextField.h index 177329cf860..a037adff795 100644 --- a/jdk/src/windows/native/sun/windows/awt_TextField.h +++ b/jdk/src/windows/native/sun/windows/awt_TextField.h @@ -55,9 +55,14 @@ public: static void _SetEchoChar(void *param); protected: - void EditSetSel(CHARRANGE &cr); - void EditGetSel(CHARRANGE &cr); LONG EditGetCharFromPos(POINT& pt); + virtual void Reshape(int x, int y, int w, int h); + +private: + void EditSetSel(CHARRANGE &cr); + void initialRescroll(); + + bool m_initialRescrollFlag; }; #endif /* AWT_TEXTFIELD_H */ diff --git a/jdk/test/java/awt/Menu/NullMenuLabelTest/NullMenuLabelTest.java b/jdk/test/java/awt/Menu/NullMenuLabelTest/NullMenuLabelTest.java new file mode 100644 index 00000000000..e779f40aab2 --- /dev/null +++ b/jdk/test/java/awt/Menu/NullMenuLabelTest/NullMenuLabelTest.java @@ -0,0 +1,26 @@ +/* @test 1.5 98/07/23 + @bug 4064202 4253466 + @summary Test for Win32 NPE when MenuItem with null label added. + @author fred.ecks + @run main/othervm NullMenuLabelTest +*/ + +import java.awt.*; + +public class NullMenuLabelTest { + + public static void main(String[] args) { + Frame frame = new Frame("Test Frame"); + frame.pack(); + frame.setVisible(true); + MenuBar menuBar = new MenuBar(); + frame.setMenuBar(menuBar); + Menu menu = new Menu(null); + menuBar.add(menu); + menu.add(new MenuItem(null)); + // If we got this far, the test succeeded + frame.setVisible(false); + frame.dispose(); + } + +} // class NullMenuLabelTest diff --git a/jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.java b/jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.java index 9f9073fb590..fb9df2cedab 100644 --- a/jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.java +++ b/jdk/test/java/awt/TextField/ScrollSelectionTest/ScrollSelectionTest.java @@ -53,13 +53,14 @@ public class ScrollSelectionTest extends Applet frame.add(tf); tf.select(0, 20); - String[] instructions = - { + String[] instructions = { "INSTRUCTIONS:", "This is a test for a win32 specific problem", - "If you see all the letters from 'a' to 'z' and", - "letters from 'a' to 't' are selected then test passes" - }; + "If you see all the letters from 'a' to 'z' and", + "letters from 'a' to 't' are selected then test passes.", + "You may have to activate the frame to see the selection" + + " highlighted (e.g. by clicking on frame's title)." + }; Sysout.createDialogWithInstructions( instructions ); }// init() diff --git a/jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_3.java b/jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_3.java index 2b03496b850..d2de08e0f72 100644 --- a/jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_3.java +++ b/jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_3.java @@ -114,6 +114,7 @@ public class SpuriousExitEnter_3 { checkEvents(frameAdapter, 1, 1); checkEvents(buttonAdapter, 0, 0); w.setVisible(false); + Util.waitForIdle(r); } public static void main(String []s) From c8f3efcc756d414ffc5997a52a4b9302cd5d5fd5 Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Tue, 31 Aug 2010 09:15:34 -0700 Subject: [PATCH 021/128] 6981005: TEST BUG: java/lang/ClassLoader/TestCrossDelegate.sh timeout on windows Increase timeout value Reviewed-by: alanb --- jdk/test/ProblemList.txt | 3 --- .../ClassLoader/deadlock/TestCrossDelegate.sh | 17 +++++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index ab70ed9deeb..831b3a190e6 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -201,9 +201,6 @@ java/lang/ThreadLocal/MemoryLeak.java solaris-all # Windows X64, RuntimeException: MyThread expected to have RUNNABLE but got WAITING java/lang/Thread/ThreadStateTest.java generic-all -# Timeout on windows 64bit -java/lang/ClassLoader/deadlock/TestCrossDelegate.sh generic-all - ############################################################################ # jdk_management diff --git a/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh b/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh index 71e07441ce2..1c7d5657423 100644 --- a/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh +++ b/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh @@ -25,7 +25,7 @@ # @summary (cl) ClassLoader.loadClass locks all instances in chain # when delegating # -# @run shell/timeout=10 TestCrossDelegate.sh +# @run shell/timeout=300 TestCrossDelegate.sh # if running by hand on windows, change TESTSRC and TESTCLASSES to "." if [ "${TESTSRC}" = "" ] ; then @@ -41,10 +41,6 @@ if [ "${TESTJAVA}" = "" ] ; then echo "FAILED!!!" exit 1 fi -echo TESTSRC=${TESTSRC} -echo TESTCLASSES=${TESTCLASSES} -echo TESTJAVA=${TESTJAVA} -echo "" # set platform-specific variables OS=`uname -s` @@ -55,11 +51,20 @@ case "$OS" in Linux ) FS="/" ;; - Windows* | CYGWIN* ) + Windows*) FS="\\" ;; + CYGWIN* ) + FS="\\" + TESTCLASSES=`/usr/bin/cygpath -a -s -m ${TESTCLASSES}` + ;; esac +echo TESTSRC=${TESTSRC} +echo TESTCLASSES=${TESTCLASSES} +echo TESTJAVA=${TESTJAVA} +echo "" + # compile test ${TESTJAVA}${FS}bin${FS}javac \ -d ${TESTCLASSES} \ From 2aa1723b3999868f589005e5fdd6455a1f1f77b1 Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Tue, 31 Aug 2010 09:17:46 -0700 Subject: [PATCH 022/128] 6977548: Broken link in ClassLoader.defineClass javadoc Reviewed-by: valeriep --- jdk/src/share/classes/java/lang/ClassLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/share/classes/java/lang/ClassLoader.java b/jdk/src/share/classes/java/lang/ClassLoader.java index d3346417c0f..fd9ba91d720 100644 --- a/jdk/src/share/classes/java/lang/ClassLoader.java +++ b/jdk/src/share/classes/java/lang/ClassLoader.java @@ -823,7 +823,7 @@ public abstract class ClassLoader { * * * @param name - * The expected binary namebinary name. of the class, or * null if not known * * @param b From 6d2cb040131ac74983399eeceb03436232de5143 Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Tue, 31 Aug 2010 11:27:10 -0700 Subject: [PATCH 023/128] 4700857: RFE: separating user locale and user interface locale Reviewed-by: okutsu --- .../share/classes/java/text/DateFormat.java | 12 +- .../classes/java/text/DateFormatSymbols.java | 4 +- .../classes/java/text/DecimalFormat.java | 4 +- .../java/text/DecimalFormatSymbols.java | 4 +- .../classes/java/text/MessageFormat.java | 2 +- .../share/classes/java/text/NumberFormat.java | 12 +- .../classes/java/text/SimpleDateFormat.java | 6 +- jdk/src/share/classes/java/util/Calendar.java | 6 +- jdk/src/share/classes/java/util/Currency.java | 4 +- .../share/classes/java/util/Formatter.java | 18 +- .../classes/java/util/GregorianCalendar.java | 4 +- jdk/src/share/classes/java/util/Locale.java | 203 +- jdk/src/share/classes/java/util/Scanner.java | 4 +- jdk/src/share/classes/java/util/TimeZone.java | 4 +- jdk/src/share/native/java/lang/System.c | 120 +- jdk/src/share/native/java/lang/java_props.h | 6 + .../solaris/native/java/lang/java_props_md.c | 361 +- .../windows/native/java/lang/java_props_md.c | 600 +-- .../native/sun/windows/awt_DataTransferer.cpp | 1 + .../native/sun/windows/awt_InputMethod.cpp | 7 +- .../java/util/Formatter/Constructors.java | 2 +- jdk/test/java/util/Locale/LocaleCategory.sh | 79 + .../java/util/Locale/PrintDefaultLocale.java | 13 +- jdk/test/java/util/Locale/data/deflocale.c | 225 +- .../java/util/Locale/data/deflocale.input | 7 + jdk/test/java/util/Locale/data/deflocale.jds3 | 1793 -------- .../java/util/Locale/data/deflocale.rhel4 | 1623 ------- .../java/util/Locale/data/deflocale.rhel5 | 3924 +++++++++++++++++ .../Locale/data/deflocale.rhel5.fmtasdefault | 3924 +++++++++++++++++ jdk/test/java/util/Locale/data/deflocale.sh | 17 +- .../java/util/Locale/data/deflocale.sol10 | 2047 +++++---- .../Locale/data/deflocale.sol10.fmtasdefault | 1725 ++++++++ jdk/test/java/util/Locale/data/deflocale.win7 | 1494 +++++++ .../Locale/data/deflocale.win7.fmtasdefault | 1494 +++++++ .../java/util/Locale/data/deflocale.winvista | 1031 ----- .../java/util/Locale/data/deflocale.winxp | 861 ---- 36 files changed, 14681 insertions(+), 6960 deletions(-) create mode 100644 jdk/test/java/util/Locale/LocaleCategory.sh create mode 100644 jdk/test/java/util/Locale/data/deflocale.input delete mode 100644 jdk/test/java/util/Locale/data/deflocale.jds3 delete mode 100644 jdk/test/java/util/Locale/data/deflocale.rhel4 create mode 100644 jdk/test/java/util/Locale/data/deflocale.rhel5 create mode 100644 jdk/test/java/util/Locale/data/deflocale.rhel5.fmtasdefault create mode 100644 jdk/test/java/util/Locale/data/deflocale.sol10.fmtasdefault create mode 100644 jdk/test/java/util/Locale/data/deflocale.win7 create mode 100644 jdk/test/java/util/Locale/data/deflocale.win7.fmtasdefault delete mode 100644 jdk/test/java/util/Locale/data/deflocale.winvista delete mode 100644 jdk/test/java/util/Locale/data/deflocale.winxp diff --git a/jdk/src/share/classes/java/text/DateFormat.java b/jdk/src/share/classes/java/text/DateFormat.java index 8bc6d017dd8..fdd8eebea07 100644 --- a/jdk/src/share/classes/java/text/DateFormat.java +++ b/jdk/src/share/classes/java/text/DateFormat.java @@ -443,7 +443,7 @@ public abstract class DateFormat extends Format { */ public final static DateFormat getTimeInstance() { - return get(DEFAULT, 0, 1, Locale.getDefault()); + return get(DEFAULT, 0, 1, Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -455,7 +455,7 @@ public abstract class DateFormat extends Format { */ public final static DateFormat getTimeInstance(int style) { - return get(style, 0, 1, Locale.getDefault()); + return get(style, 0, 1, Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -479,7 +479,7 @@ public abstract class DateFormat extends Format { */ public final static DateFormat getDateInstance() { - return get(0, DEFAULT, 2, Locale.getDefault()); + return get(0, DEFAULT, 2, Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -491,7 +491,7 @@ public abstract class DateFormat extends Format { */ public final static DateFormat getDateInstance(int style) { - return get(0, style, 2, Locale.getDefault()); + return get(0, style, 2, Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -515,7 +515,7 @@ public abstract class DateFormat extends Format { */ public final static DateFormat getDateTimeInstance() { - return get(DEFAULT, DEFAULT, 3, Locale.getDefault()); + return get(DEFAULT, DEFAULT, 3, Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -530,7 +530,7 @@ public abstract class DateFormat extends Format { public final static DateFormat getDateTimeInstance(int dateStyle, int timeStyle) { - return get(timeStyle, dateStyle, 3, Locale.getDefault()); + return get(timeStyle, dateStyle, 3, Locale.getDefault(Locale.Category.FORMAT)); } /** diff --git a/jdk/src/share/classes/java/text/DateFormatSymbols.java b/jdk/src/share/classes/java/text/DateFormatSymbols.java index 70b4955114a..4776ead6991 100644 --- a/jdk/src/share/classes/java/text/DateFormatSymbols.java +++ b/jdk/src/share/classes/java/text/DateFormatSymbols.java @@ -118,7 +118,7 @@ public class DateFormatSymbols implements Serializable, Cloneable { */ public DateFormatSymbols() { - initializeData(Locale.getDefault()); + initializeData(Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -282,7 +282,7 @@ public class DateFormatSymbols implements Serializable, Cloneable { * @since 1.6 */ public static final DateFormatSymbols getInstance() { - return getInstance(Locale.getDefault()); + return getInstance(Locale.getDefault(Locale.Category.FORMAT)); } /** diff --git a/jdk/src/share/classes/java/text/DecimalFormat.java b/jdk/src/share/classes/java/text/DecimalFormat.java index 01bc8c5d02d..3a0d9b475bf 100644 --- a/jdk/src/share/classes/java/text/DecimalFormat.java +++ b/jdk/src/share/classes/java/text/DecimalFormat.java @@ -392,7 +392,7 @@ public class DecimalFormat extends NumberFormat { * @see java.text.NumberFormat#getPercentInstance */ public DecimalFormat() { - Locale def = Locale.getDefault(); + Locale def = Locale.getDefault(Locale.Category.FORMAT); // try to get the pattern from the cache String pattern = (String) cachedLocaleData.get(def); if (pattern == null) { /* cache miss */ @@ -430,7 +430,7 @@ public class DecimalFormat extends NumberFormat { */ public DecimalFormat(String pattern) { // Always applyPattern after the symbols are set - this.symbols = new DecimalFormatSymbols(Locale.getDefault()); + this.symbols = new DecimalFormatSymbols(Locale.getDefault(Locale.Category.FORMAT)); applyPattern(pattern, false); } diff --git a/jdk/src/share/classes/java/text/DecimalFormatSymbols.java b/jdk/src/share/classes/java/text/DecimalFormatSymbols.java index d13d61320af..35815614285 100644 --- a/jdk/src/share/classes/java/text/DecimalFormatSymbols.java +++ b/jdk/src/share/classes/java/text/DecimalFormatSymbols.java @@ -76,7 +76,7 @@ public class DecimalFormatSymbols implements Cloneable, Serializable { * {@link #getInstance(Locale) getInstance} method. */ public DecimalFormatSymbols() { - initialize( Locale.getDefault() ); + initialize( Locale.getDefault(Locale.Category.FORMAT) ); } /** @@ -125,7 +125,7 @@ public class DecimalFormatSymbols implements Cloneable, Serializable { * @since 1.6 */ public static final DecimalFormatSymbols getInstance() { - return getInstance(Locale.getDefault()); + return getInstance(Locale.getDefault(Locale.Category.FORMAT)); } /** diff --git a/jdk/src/share/classes/java/text/MessageFormat.java b/jdk/src/share/classes/java/text/MessageFormat.java index a0025985baa..ec5c7ff0d65 100644 --- a/jdk/src/share/classes/java/text/MessageFormat.java +++ b/jdk/src/share/classes/java/text/MessageFormat.java @@ -363,7 +363,7 @@ public class MessageFormat extends Format { * @exception IllegalArgumentException if the pattern is invalid */ public MessageFormat(String pattern) { - this.locale = Locale.getDefault(); + this.locale = Locale.getDefault(Locale.Category.FORMAT); applyPattern(pattern); } diff --git a/jdk/src/share/classes/java/text/NumberFormat.java b/jdk/src/share/classes/java/text/NumberFormat.java index fd4e92884fa..d80e4bcbd53 100644 --- a/jdk/src/share/classes/java/text/NumberFormat.java +++ b/jdk/src/share/classes/java/text/NumberFormat.java @@ -381,7 +381,7 @@ public abstract class NumberFormat extends Format { * {@link #getNumberInstance() getNumberInstance()}. */ public final static NumberFormat getInstance() { - return getInstance(Locale.getDefault(), NUMBERSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), NUMBERSTYLE); } /** @@ -397,7 +397,7 @@ public abstract class NumberFormat extends Format { * Returns a general-purpose number format for the current default locale. */ public final static NumberFormat getNumberInstance() { - return getInstance(Locale.getDefault(), NUMBERSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), NUMBERSTYLE); } /** @@ -420,7 +420,7 @@ public abstract class NumberFormat extends Format { * @since 1.4 */ public final static NumberFormat getIntegerInstance() { - return getInstance(Locale.getDefault(), INTEGERSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), INTEGERSTYLE); } /** @@ -443,7 +443,7 @@ public abstract class NumberFormat extends Format { * Returns a currency format for the current default locale. */ public final static NumberFormat getCurrencyInstance() { - return getInstance(Locale.getDefault(), CURRENCYSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), CURRENCYSTYLE); } /** @@ -457,7 +457,7 @@ public abstract class NumberFormat extends Format { * Returns a percentage format for the current default locale. */ public final static NumberFormat getPercentInstance() { - return getInstance(Locale.getDefault(), PERCENTSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), PERCENTSTYLE); } /** @@ -471,7 +471,7 @@ public abstract class NumberFormat extends Format { * Returns a scientific format for the current default locale. */ /*public*/ final static NumberFormat getScientificInstance() { - return getInstance(Locale.getDefault(), SCIENTIFICSTYLE); + return getInstance(Locale.getDefault(Locale.Category.FORMAT), SCIENTIFICSTYLE); } /** diff --git a/jdk/src/share/classes/java/text/SimpleDateFormat.java b/jdk/src/share/classes/java/text/SimpleDateFormat.java index 060e7bf642e..91f35c9cde4 100644 --- a/jdk/src/share/classes/java/text/SimpleDateFormat.java +++ b/jdk/src/share/classes/java/text/SimpleDateFormat.java @@ -474,7 +474,7 @@ public class SimpleDateFormat extends DateFormat { * class. */ public SimpleDateFormat() { - this(SHORT, SHORT, Locale.getDefault()); + this(SHORT, SHORT, Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -490,7 +490,7 @@ public class SimpleDateFormat extends DateFormat { */ public SimpleDateFormat(String pattern) { - this(pattern, Locale.getDefault()); + this(pattern, Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -535,7 +535,7 @@ public class SimpleDateFormat extends DateFormat { this.pattern = pattern; this.formatData = (DateFormatSymbols) formatSymbols.clone(); - this.locale = Locale.getDefault(); + this.locale = Locale.getDefault(Locale.Category.FORMAT); initializeCalendar(this.locale); initialize(this.locale); useDateFormatSymbols = true; diff --git a/jdk/src/share/classes/java/util/Calendar.java b/jdk/src/share/classes/java/util/Calendar.java index 80a193687d0..3e7b9f6b1b8 100644 --- a/jdk/src/share/classes/java/util/Calendar.java +++ b/jdk/src/share/classes/java/util/Calendar.java @@ -933,7 +933,7 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable= 0) { - country = region.substring(0, i); - variant = region.substring(i + 1); - } else { - country = region; - variant = ""; - } - } else { - country = AccessController.doPrivileged( - new GetPropertyAction("user.country", "")); - variant = AccessController.doPrivileged( - new GetPropertyAction("user.variant", "")); - } - defaultLocale = getInstance(language, country, variant); + initDefault(); } return defaultLocale; } + /** + * Gets the current value of the default locale for the specified Category + * for this instance of the Java Virtual Machine. + *

+ * The Java Virtual Machine sets the default locale during startup based + * on the host environment. It is used by many locale-sensitive methods + * if no locale is explicitly specified. It can be changed using the + * setDefault(Locale.Category, Locale) method. + * + * @param category - the specified category to get the default locale + * @throws NullPointerException - if category is null + * @return the default locale for the specified Category for this instance + * of the Java Virtual Machine + * @see #setDefault(Locale.Category, Locale) + * @since 1.7 + */ + public static Locale getDefault(Locale.Category category) { + // do not synchronize this method - see 4071298 + // it's OK if more than one default locale happens to be created + switch (category) { + case DISPLAY: + if (defaultDisplayLocale == null) { + initDefault(category); + } + return defaultDisplayLocale; + case FORMAT: + if (defaultFormatLocale == null) { + initDefault(category); + } + return defaultFormatLocale; + default: + assert false: "Unknown Category"; + } + return getDefault(); + } + + private static void initDefault() { + String language, region, country, variant; + language = AccessController.doPrivileged( + new GetPropertyAction("user.language", "en")); + // for compatibility, check for old user.region property + region = AccessController.doPrivileged( + new GetPropertyAction("user.region")); + if (region != null) { + // region can be of form country, country_variant, or _variant + int i = region.indexOf('_'); + if (i >= 0) { + country = region.substring(0, i); + variant = region.substring(i + 1); + } else { + country = region; + variant = ""; + } + } else { + country = AccessController.doPrivileged( + new GetPropertyAction("user.country", "")); + variant = AccessController.doPrivileged( + new GetPropertyAction("user.variant", "")); + } + defaultLocale = getInstance(language, country, variant); + } + + private static void initDefault(Locale.Category category) { + String language, region, country, variant; + switch (category) { + case DISPLAY: + language = AccessController.doPrivileged( + new GetPropertyAction("user.language.display", "")); + if ("".equals(language)) { + defaultDisplayLocale = getDefault(); + } else { + country = AccessController.doPrivileged( + new GetPropertyAction("user.country.display", "")); + variant = AccessController.doPrivileged( + new GetPropertyAction("user.variant.display", "")); + defaultDisplayLocale = getInstance(language, country, variant); + } + break; + case FORMAT: + language = AccessController.doPrivileged( + new GetPropertyAction("user.language.format", "")); + if ("".equals(language)) { + defaultFormatLocale = getDefault(); + } else { + country = AccessController.doPrivileged( + new GetPropertyAction("user.country.format", "")); + variant = AccessController.doPrivileged( + new GetPropertyAction("user.variant.format", "")); + defaultFormatLocale = getInstance(language, country, variant); + } + break; + } + } + /** * Sets the default locale for this instance of the Java Virtual Machine. * This does not affect the host locale. @@ -438,6 +510,9 @@ public final class Locale implements Cloneable, Serializable { * of functionality, this method should only be used if the caller * is prepared to reinitialize locale-sensitive code running * within the same Java Virtual Machine. + *

+ * By setting the default locale with this method, all of the default + * locales for each Category are also set to the specified default locale. * * @throws SecurityException * if a security manager exists and its @@ -448,13 +523,59 @@ public final class Locale implements Cloneable, Serializable { * @see java.util.PropertyPermission */ public static synchronized void setDefault(Locale newLocale) { + setDefault(Category.DISPLAY, newLocale); + setDefault(Category.FORMAT, newLocale); + defaultLocale = newLocale; + } + + /** + * Sets the default locale for the specified Category for this instance + * of the Java Virtual Machine. This does not affect the host locale. + *

+ * If there is a security manager, its checkPermission method is called + * with a PropertyPermission("user.language", "write") permission before + * the default locale is changed. + *

+ * The Java Virtual Machine sets the default locale during startup based + * on the host environment. It is used by many locale-sensitive methods + * if no locale is explicitly specified. + *

+ * Since changing the default locale may affect many different areas of + * functionality, this method should only be used if the caller is + * prepared to reinitialize locale-sensitive code running within the + * same Java Virtual Machine. + *

+ * + * @param category - the specified category to set the default locale + * @param newLocale - the new default locale + * @throws SecurityException - if a security manager exists and its + * checkPermission method doesn't allow the operation. + * @throws NullPointerException - if category and/or newLocale is null + * @see SecurityManager.checkPermission(java.security.Permission) + * @see PropertyPermission + * @see #getDefault(Locale.Category) + * @since 1.7 + */ + public static synchronized void setDefault(Locale.Category category, + Locale newLocale) { + if (category == null) + throw new NullPointerException("Category cannot be NULL"); if (newLocale == null) throw new NullPointerException("Can't set default locale to NULL"); SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(new PropertyPermission ("user.language", "write")); - defaultLocale = newLocale; + switch (category) { + case DISPLAY: + defaultDisplayLocale = newLocale; + break; + case FORMAT: + defaultFormatLocale = newLocale; + break; + default: + assert false: "Unknown Category"; + } } /** @@ -642,7 +763,7 @@ public final class Locale implements Cloneable, Serializable { * value. If the locale doesn't specify a language, this function returns the empty string. */ public final String getDisplayLanguage() { - return getDisplayLanguage(getDefault()); + return getDisplayLanguage(getDefault(Category.DISPLAY)); } /** @@ -677,7 +798,7 @@ public final class Locale implements Cloneable, Serializable { * value. If the locale doesn't specify a country, this function returns the empty string. */ public final String getDisplayCountry() { - return getDisplayCountry(getDefault()); + return getDisplayCountry(getDefault(Category.DISPLAY)); } /** @@ -744,7 +865,7 @@ public final class Locale implements Cloneable, Serializable { * doesn't specify a variant code, this function returns the empty string. */ public final String getDisplayVariant() { - return getDisplayVariant(getDefault()); + return getDisplayVariant(getDefault(Category.DISPLAY)); } /** @@ -790,7 +911,7 @@ public final class Locale implements Cloneable, Serializable { * and variant fields are all empty, this function returns the empty string. */ public final String getDisplayName() { - return getDisplayName(getDefault()); + return getDisplayName(getDefault(Category.DISPLAY)); } /** @@ -970,6 +1091,8 @@ public final class Locale implements Cloneable, Serializable { private transient volatile int hashCodeValue = 0; private static Locale defaultLocale = null; + private static Locale defaultDisplayLocale = null; + private static Locale defaultFormatLocale = null; /** * Return an array of the display names of the variant. @@ -1140,4 +1263,28 @@ public final class Locale implements Cloneable, Serializable { return null; } } + + /** + * Enum for locale categories. These locale categories are used to get/set + * the default locale for the specific functionality represented by the + * category. + * + * @see #getDefault(Locale.Category) + * @see #setDefault(Locale.Category, Locale) + * @since 1.7 + */ + public enum Category { + + /** + * Category used to represent the default locale for + * displaying user interfaces. + */ + DISPLAY, + + /** + * Category used to represent the default locale for + * formatting dates, numbers, and/or currencies. + */ + FORMAT, + } } diff --git a/jdk/src/share/classes/java/util/Scanner.java b/jdk/src/share/classes/java/util/Scanner.java index 615250ccc3c..139e5fa38d2 100644 --- a/jdk/src/share/classes/java/util/Scanner.java +++ b/jdk/src/share/classes/java/util/Scanner.java @@ -582,7 +582,7 @@ public final class Scanner implements Iterator, Closeable { matcher = delimPattern.matcher(buf); matcher.useTransparentBounds(true); matcher.useAnchoringBounds(false); - useLocale(Locale.getDefault()); + useLocale(Locale.getDefault(Locale.Category.FORMAT)); } /** @@ -2642,7 +2642,7 @@ public final class Scanner implements Iterator, Closeable { */ public Scanner reset() { delimPattern = WHITESPACE_PATTERN; - useLocale(Locale.getDefault()); + useLocale(Locale.getDefault(Locale.Category.FORMAT)); useRadix(10); clearCaches(); return this; diff --git a/jdk/src/share/classes/java/util/TimeZone.java b/jdk/src/share/classes/java/util/TimeZone.java index 1a68ca3e887..b759f9126d5 100644 --- a/jdk/src/share/classes/java/util/TimeZone.java +++ b/jdk/src/share/classes/java/util/TimeZone.java @@ -312,7 +312,7 @@ abstract public class TimeZone implements Serializable, Cloneable { * @since 1.2 */ public final String getDisplayName() { - return getDisplayName(false, LONG, Locale.getDefault()); + return getDisplayName(false, LONG, Locale.getDefault(Locale.Category.DISPLAY)); } /** @@ -342,7 +342,7 @@ abstract public class TimeZone implements Serializable, Cloneable { * @since 1.2 */ public final String getDisplayName(boolean daylight, int style) { - return getDisplayName(daylight, style, Locale.getDefault()); + return getDisplayName(daylight, style, Locale.getDefault(Locale.Category.DISPLAY)); } /** diff --git a/jdk/src/share/native/java/lang/System.c b/jdk/src/share/native/java/lang/System.c index 75ebd79d533..830198564c2 100644 --- a/jdk/src/share/native/java/lang/System.c +++ b/jdk/src/share/native/java/lang/System.c @@ -80,6 +80,21 @@ Java_java_lang_System_identityHashCode(JNIEnv *env, jobject this, jobject x) (*env)->DeleteLocalRef(env, jval); \ (*env)->DeleteLocalRef(env, r); \ } else ((void) 0) +#define REMOVEPROP(props, key) \ + if (1) { \ + jstring jkey = JNU_NewStringPlatform(env, key); \ + jobject r = (*env)->CallObjectMethod(env, props, removeID, jkey); \ + if ((*env)->ExceptionOccurred(env)) return NULL; \ + (*env)->DeleteLocalRef(env, jkey); \ + (*env)->DeleteLocalRef(env, r); \ + } else ((void) 0) +#define GETPROP(props, key, jret) \ + if (1) { \ + jstring jkey = JNU_NewStringPlatform(env, key); \ + jret = (*env)->CallObjectMethod(env, props, getPropID, jkey); \ + if ((*env)->ExceptionOccurred(env)) return NULL; \ + (*env)->DeleteLocalRef(env, jkey); \ + } else ((void) 0) #ifndef VENDOR /* Third party may overwrite this. */ #define VENDOR "Sun Microsystems Inc." @@ -90,6 +105,60 @@ Java_java_lang_System_identityHashCode(JNIEnv *env, jobject this, jobject x) #define JAVA_MAX_SUPPORTED_VERSION 51 #define JAVA_MAX_SUPPORTED_MINOR_VERSION 0 +static int fmtdefault; // boolean value +jobject fillI18nProps(JNIEnv *env, jobject props, char *baseKey, + char *platformDispVal, char *platformFmtVal, + jmethodID putID, jmethodID getPropID) { + jstring jVMBaseVal = NULL; + + GETPROP(props, baseKey, jVMBaseVal); + if (jVMBaseVal) { + // user specified the base property. there's nothing to do here. + (*env)->DeleteLocalRef(env, jVMBaseVal); + } else { + char buf[64]; + jstring jVMVal = NULL; + const char *baseVal = ""; + + /* user.xxx base property */ + if (fmtdefault) { + if (platformFmtVal) { + PUTPROP(props, baseKey, platformFmtVal); + baseVal = platformFmtVal; + } + } else { + if (platformDispVal) { + PUTPROP(props, baseKey, platformDispVal); + baseVal = platformDispVal; + } + } + + /* user.xxx.display property */ + jio_snprintf(buf, sizeof(buf), "%s.display", baseKey); + GETPROP(props, buf, jVMVal); + if (jVMVal == NULL) { + if (platformDispVal && (strcmp(baseVal, platformDispVal) != 0)) { + PUTPROP(props, buf, platformDispVal); + } + } else { + (*env)->DeleteLocalRef(env, jVMVal); + } + + /* user.xxx.format property */ + jio_snprintf(buf, sizeof(buf), "%s.format", baseKey); + GETPROP(props, buf, jVMVal); + if (jVMVal == NULL) { + if (platformFmtVal && (strcmp(baseVal, platformFmtVal) != 0)) { + PUTPROP(props, buf, platformFmtVal); + } + } else { + (*env)->DeleteLocalRef(env, jVMVal); + } + } + + return NULL; +} + JNIEXPORT jobject JNICALL Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props) { @@ -99,6 +168,16 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props) (*env)->GetObjectClass(env, props), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + jmethodID removeID = (*env)->GetMethodID(env, + (*env)->GetObjectClass(env, props), + "remove", + "(Ljava/lang/Object;)Ljava/lang/Object;"); + jmethodID getPropID = (*env)->GetMethodID(env, + (*env)->GetObjectClass(env, props), + "getProperty", + "(Ljava/lang/String;)Ljava/lang/String;"); + jobject ret = NULL; + jstring jVMVal = NULL; if (sprops == NULL || putID == NULL ) return NULL; @@ -218,7 +297,46 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props) PUTPROP(props, "sun.desktop", sprops->desktop); } - return JVM_InitProperties(env, props); + /* + * unset "user.language", "user.country", and "user.variant" + * in order to tell whether the command line option "-DXXXX=YYYY" is + * specified or not. They will be reset in fillI18nProps() below. + */ + REMOVEPROP(props, "user.language"); + REMOVEPROP(props, "user.country"); + REMOVEPROP(props, "user.variant"); + REMOVEPROP(props, "file.encoding"); + + ret = JVM_InitProperties(env, props); + + /* Check the compatibility flag */ + GETPROP(props, "sun.locale.formatasdefault", jVMVal); + if (jVMVal) { + const char * val = (*env)->GetStringUTFChars(env, jVMVal, 0); + fmtdefault = !strcmp(val, "true"); + (*env)->ReleaseStringUTFChars(env, jVMVal, val); + (*env)->DeleteLocalRef(env, jVMVal); + } + + /* reconstruct i18n related properties */ + fillI18nProps(env, props, "user.language", sprops->display_language, + sprops->format_language, putID, getPropID); + fillI18nProps(env, props, "user.country", + sprops->display_country, sprops->format_country, putID, getPropID); + fillI18nProps(env, props, "user.variant", + sprops->display_variant, sprops->format_variant, putID, getPropID); + GETPROP(props, "file.encoding", jVMVal); + if (jVMVal == NULL) { + if (fmtdefault) { + PUTPROP(props, "file.encoding", sprops->encoding); + } else { + PUTPROP(props, "file.encoding", sprops->sun_jnu_encoding); + } + } else { + (*env)->DeleteLocalRef(env, jVMVal); + } + + return ret; } /* diff --git a/jdk/src/share/native/java/lang/java_props.h b/jdk/src/share/native/java/lang/java_props.h index e7d54f65889..eda885911a2 100644 --- a/jdk/src/share/native/java/lang/java_props.h +++ b/jdk/src/share/native/java/lang/java_props.h @@ -53,8 +53,14 @@ typedef struct { nchar *user_home; char *language; + char *format_language; + char *display_language; char *country; + char *format_country; + char *display_country; char *variant; + char *format_variant; + char *display_variant; char *encoding; char *sun_jnu_encoding; char *timezone; diff --git a/jdk/src/solaris/native/java/lang/java_props_md.c b/jdk/src/solaris/native/java/lang/java_props_md.c index 914fae6d3bf..979a73ce23c 100644 --- a/jdk/src/solaris/native/java/lang/java_props_md.c +++ b/jdk/src/solaris/native/java/lang/java_props_md.c @@ -115,6 +115,174 @@ setPathEnvironment(char *envstring) #define P_tmpdir "/var/tmp" #endif +static int ParseLocale(int cat, char ** std_language, char ** std_country, char ** std_variant, char ** std_encoding) { + char temp[64]; + char *language = NULL, *country = NULL, *variant = NULL, + *encoding = NULL; + char *p, encoding_variant[64]; + char *lc; + + /* Query the locale set for the category */ + lc = setlocale(cat, NULL); + +#ifndef __linux__ + if (lc == NULL) { + return 0; + } + + if (cat == LC_CTYPE) { + /* + * Workaround for Solaris bug 4201684: Xlib doesn't like @euro + * locales. Since we don't depend on the libc @euro behavior, + * we just remove the qualifier. + * On Linux, the bug doesn't occur; on the other hand, @euro + * is needed there because it's a shortcut that also determines + * the encoding - without it, we wouldn't get ISO-8859-15. + * Therefore, this code section is Solaris-specific. + */ + lc = strdup(lc); /* keep a copy, setlocale trashes original. */ + strcpy(temp, lc); + p = strstr(temp, "@euro"); + if (p != NULL) { + *p = '\0'; + setlocale(LC_ALL, temp); + } + } +#else + if (lc == NULL || !strcmp(lc, "C") || !strcmp(lc, "POSIX")) { + lc = "en_US"; + } +#endif + + /* + * locale string format in Solaris is + * _.@ + * , , and are optional. + */ + + strcpy(temp, lc); + + /* Parse the language, country, encoding, and variant from the + * locale. Any of the elements may be missing, but they must occur + * in the order language_country.encoding@variant, and must be + * preceded by their delimiter (except for language). + * + * If the locale name (without .encoding@variant, if any) matches + * any of the names in the locale_aliases list, map it to the + * corresponding full locale name. Most of the entries in the + * locale_aliases list are locales that include a language name but + * no country name, and this facility is used to map each language + * to a default country if that's possible. It's also used to map + * the Solaris locale aliases to their proper Java locale IDs. + */ + if ((p = strchr(temp, '.')) != NULL) { + strcpy(encoding_variant, p); /* Copy the leading '.' */ + *p = '\0'; + } else if ((p = strchr(temp, '@')) != NULL) { + strcpy(encoding_variant, p); /* Copy the leading '@' */ + *p = '\0'; + } else { + *encoding_variant = '\0'; + } + + if (mapLookup(locale_aliases, temp, &p)) { + strcpy(temp, p); + } + + language = temp; + if ((country = strchr(temp, '_')) != NULL) { + *country++ = '\0'; + } + + p = encoding_variant; + if ((encoding = strchr(p, '.')) != NULL) { + p[encoding++ - p] = '\0'; + p = encoding; + } + if ((variant = strchr(p, '@')) != NULL) { + p[variant++ - p] = '\0'; + } + + /* Normalize the language name */ + if (std_language != NULL) { + *std_language = "en"; + if (language != NULL) { + mapLookup(language_names, language, std_language); + } + } + + /* Normalize the country name */ + if (std_country != NULL && country != NULL) { + *std_country = country; + mapLookup(country_names, country, std_country); + } + + /* Normalize the variant name. Note that we only use + * variants listed in the mapping array; others are ignored. */ + if (std_variant != NULL && variant != NULL) { + mapLookup(variant_names, variant, std_variant); + } + + /* Normalize the encoding name. Note that we IGNORE the string + * 'encoding' extracted from the locale name above. Instead, we use the + * more reliable method of calling nl_langinfo(CODESET). This function + * returns an empty string if no encoding is set for the given locale + * (e.g., the C or POSIX locales); we use the default ISO 8859-1 + * converter for such locales. + */ + if (std_encoding != NULL) { + /* OK, not so reliable - nl_langinfo() gives wrong answers on + * Euro locales, in particular. */ + if (strcmp(p, "ISO8859-15") == 0) + p = "ISO8859-15"; + else + p = nl_langinfo(CODESET); + + /* Convert the bare "646" used on Solaris to a proper IANA name */ + if (strcmp(p, "646") == 0) + p = "ISO646-US"; + + /* return same result nl_langinfo would return for en_UK, + * in order to use optimizations. */ + *std_encoding = (*p != '\0') ? p : "ISO8859-1"; + +#ifdef __linux__ + /* + * Remap the encoding string to a different value for japanese + * locales on linux so that customized converters are used instead + * of the default converter for "EUC-JP". The customized converters + * omit support for the JIS0212 encoding which is not supported by + * the variant of "EUC-JP" encoding used on linux + */ + if (strcmp(p, "EUC-JP") == 0) { + *std_encoding = "EUC-JP-LINUX"; + } +#else + if (strcmp(p,"eucJP") == 0) { + /* For Solaris use customized vendor defined character + * customized EUC-JP converter + */ + *std_encoding = "eucJP-open"; + } else if (strcmp(p, "Big5") == 0 || strcmp(p, "BIG5") == 0) { + /* + * Remap the encoding string to Big5_Solaris which augments + * the default converter for Solaris Big5 locales to include + * seven additional ideographic characters beyond those included + * in the Java "Big5" converter. + */ + *std_encoding = "Big5_Solaris"; + } else if (strcmp(p, "Big5-HKSCS") == 0) { + /* + * Solaris uses HKSCS2001 + */ + *std_encoding = "Big5-HKSCS-2001"; + } +#endif + } + + return 1; +} + /* This function gets called very early, before VM_CALLS are setup. * Do not use any of the VM_CALLS entries!!! */ @@ -185,182 +353,25 @@ GetJavaProperties(JNIEnv *env) /* Determine the language, country, variant, and encoding from the host, * and store these in the user.language, user.country, user.variant and * file.encoding system properties. */ - { - char *lc; - lc = setlocale(LC_CTYPE, ""); -#ifndef __linux__ - if (lc == NULL) { - /* - * 'lc == null' means system doesn't support user's environment - * variable's locale. - */ - setlocale(LC_ALL, "C"); - sprops.language = "en"; - sprops.encoding = "ISO8859-1"; - sprops.sun_jnu_encoding = sprops.encoding; - } else { -#else - if (lc == NULL || !strcmp(lc, "C") || !strcmp(lc, "POSIX")) { - lc = "en_US"; - } - { -#endif - - /* - * locale string format in Solaris is - * _.@ - * , , and are optional. - */ - char temp[64]; - char *language = NULL, *country = NULL, *variant = NULL, - *encoding = NULL; - char *std_language = NULL, *std_country = NULL, *std_variant = NULL, - *std_encoding = NULL; - char *p, encoding_variant[64]; - int i, found; - -#ifndef __linux__ - /* - * Workaround for Solaris bug 4201684: Xlib doesn't like @euro - * locales. Since we don't depend on the libc @euro behavior, - * we just remove the qualifier. - * On Linux, the bug doesn't occur; on the other hand, @euro - * is needed there because it's a shortcut that also determines - * the encoding - without it, we wouldn't get ISO-8859-15. - * Therefore, this code section is Solaris-specific. - */ - lc = strdup(lc); /* keep a copy, setlocale trashes original. */ - strcpy(temp, lc); - p = strstr(temp, "@euro"); - if (p != NULL) - *p = '\0'; - setlocale(LC_ALL, temp); -#endif - - strcpy(temp, lc); - - /* Parse the language, country, encoding, and variant from the - * locale. Any of the elements may be missing, but they must occur - * in the order language_country.encoding@variant, and must be - * preceded by their delimiter (except for language). - * - * If the locale name (without .encoding@variant, if any) matches - * any of the names in the locale_aliases list, map it to the - * corresponding full locale name. Most of the entries in the - * locale_aliases list are locales that include a language name but - * no country name, and this facility is used to map each language - * to a default country if that's possible. It's also used to map - * the Solaris locale aliases to their proper Java locale IDs. - */ - if ((p = strchr(temp, '.')) != NULL) { - strcpy(encoding_variant, p); /* Copy the leading '.' */ - *p = '\0'; - } else if ((p = strchr(temp, '@')) != NULL) { - strcpy(encoding_variant, p); /* Copy the leading '@' */ - *p = '\0'; - } else { - *encoding_variant = '\0'; - } - - if (mapLookup(locale_aliases, temp, &p)) { - strcpy(temp, p); - } - - language = temp; - if ((country = strchr(temp, '_')) != NULL) { - *country++ = '\0'; - } - - p = encoding_variant; - if ((encoding = strchr(p, '.')) != NULL) { - p[encoding++ - p] = '\0'; - p = encoding; - } - if ((variant = strchr(p, '@')) != NULL) { - p[variant++ - p] = '\0'; - } - - /* Normalize the language name */ - std_language = "en"; - if (language != NULL) { - mapLookup(language_names, language, &std_language); - } - sprops.language = std_language; - - /* Normalize the country name */ - if (country != NULL) { - std_country = country; - mapLookup(country_names, country, &std_country); - sprops.country = strdup(std_country); - } - - /* Normalize the variant name. Note that we only use - * variants listed in the mapping array; others are ignored. */ - if (variant != NULL) { - mapLookup(variant_names, variant, &std_variant); - sprops.variant = std_variant; - } - - /* Normalize the encoding name. Note that we IGNORE the string - * 'encoding' extracted from the locale name above. Instead, we use the - * more reliable method of calling nl_langinfo(CODESET). This function - * returns an empty string if no encoding is set for the given locale - * (e.g., the C or POSIX locales); we use the default ISO 8859-1 - * converter for such locales. - */ - - /* OK, not so reliable - nl_langinfo() gives wrong answers on - * Euro locales, in particular. */ - if (strcmp(p, "ISO8859-15") == 0) - p = "ISO8859-15"; - else - p = nl_langinfo(CODESET); - - /* Convert the bare "646" used on Solaris to a proper IANA name */ - if (strcmp(p, "646") == 0) - p = "ISO646-US"; - - /* return same result nl_langinfo would return for en_UK, - * in order to use optimizations. */ - std_encoding = (*p != '\0') ? p : "ISO8859-1"; - - -#ifdef __linux__ - /* - * Remap the encoding string to a different value for japanese - * locales on linux so that customized converters are used instead - * of the default converter for "EUC-JP". The customized converters - * omit support for the JIS0212 encoding which is not supported by - * the variant of "EUC-JP" encoding used on linux - */ - if (strcmp(p, "EUC-JP") == 0) { - std_encoding = "EUC-JP-LINUX"; - } -#else - if (strcmp(p,"eucJP") == 0) { - /* For Solaris use customized vendor defined character - * customized EUC-JP converter - */ - std_encoding = "eucJP-open"; - } else if (strcmp(p, "Big5") == 0 || strcmp(p, "BIG5") == 0) { - /* - * Remap the encoding string to Big5_Solaris which augments - * the default converter for Solaris Big5 locales to include - * seven additional ideographic characters beyond those included - * in the Java "Big5" converter. - */ - std_encoding = "Big5_Solaris"; - } else if (strcmp(p, "Big5-HKSCS") == 0) { - /* - * Solaris uses HKSCS2001 - */ - std_encoding = "Big5-HKSCS-2001"; - } -#endif - sprops.encoding = std_encoding; - sprops.sun_jnu_encoding = sprops.encoding; - } + setlocale(LC_ALL, ""); + if (ParseLocale(LC_CTYPE, + &(sprops.format_language), + &(sprops.format_country), + &(sprops.format_variant), + &(sprops.encoding))) { + ParseLocale(LC_MESSAGES, + &(sprops.language), + &(sprops.country), + &(sprops.variant), + NULL); + } else { + sprops.language = "en"; + sprops.encoding = "ISO8859-1"; } + sprops.display_language = sprops.language; + sprops.display_country = sprops.country; + sprops.display_variant = sprops.variant; + sprops.sun_jnu_encoding = sprops.encoding; #ifdef __linux__ #if __BYTE_ORDER == __LITTLE_ENDIAN diff --git a/jdk/src/windows/native/java/lang/java_props_md.c b/jdk/src/windows/native/java/lang/java_props_md.c index 37acdfda002..300ab224498 100644 --- a/jdk/src/windows/native/java/lang/java_props_md.c +++ b/jdk/src/windows/native/java/lang/java_props_md.c @@ -43,413 +43,48 @@ #endif typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); +static void SetupI18nProps(LCID lcid, char** language, char** country, + char** variant, char** encoding); #define SHELL_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" -/* Encodings for Windows language groups. According to - www.microsoft.com/globaldev/faqs/locales.asp, - some locales do not have codepages, and are - supported in Windows 2000/XP solely through Unicode. - In this case, we use utf-8 encoding */ - -static char *encoding_names[] = { - "Cp1250", /* 0:Latin 2 */ - "Cp1251", /* 1:Cyrillic */ - "Cp1252", /* 2:Latin 1 */ - "Cp1253", /* 3:Greek */ - "Cp1254", /* 4:Latin 5 */ - "Cp1255", /* 5:Hebrew */ - "Cp1256", /* 6:Arabic */ - "Cp1257", /* 7:Baltic */ - "Cp1258", /* 8:Viet Nam */ - "MS874", /* 9:Thai */ - "MS932", /* 10:Japanese */ - "GBK", /* 11:PRC GBK */ - "MS949", /* 12:Korean Extended Wansung */ - "MS950", /* 13:Chinese (Taiwan, Hongkong, Macau) */ - "utf-8", /* 14:Unicode */ - "MS1361", /* 15:Korean Johab */ -}; - -/* - * List mapping from LanguageID to Java locale IDs. - * The entries in this list should not be construed to suggest we actually have - * full locale-data and other support for all of these locales; these are - * merely all of the Windows locales for which we could construct an accurate - * locale ID. The data is based on the web page "Windows XP/Server 2003 - - * List of Locale IDs, Input Locale, and Language Collection" - * (http://www.microsoft.com/globaldev/reference/winxp/xp-lcid.mspx) - * - * Some of the language IDs below are not yet used by Windows, but were - * defined by Microsoft for other products, such as Office XP. They may - * become Windows language IDs in the future. - * - */ -typedef struct LANGIDtoLocale { - WORD langID; - WORD encoding; - char* javaID; -} LANGIDtoLocale; - -static LANGIDtoLocale langIDMap[] = { - /* fallback locales to use when the country code doesn't match anything we have */ - 0x01, 6, "ar", - 0x02, 1, "bg", - 0x03, 2, "ca", - 0x04, 11, "zh", - 0x05, 0, "cs", - 0x06, 2, "da", - 0x07, 2, "de", - 0x08, 3, "el", - 0x09, 2, "en", - 0x0a, 2, "es", - 0x0b, 2, "fi", - 0x0c, 2, "fr", - 0x0d, 5, "iw", - 0x0e, 0, "hu", - 0x0f, 2, "is", - 0x10, 2, "it", - 0x11, 10, "ja", - 0x12, 12, "ko", - 0x13, 2, "nl", - 0x14, 2, "no", - 0x15, 0, "pl", - 0x16, 2, "pt", - 0x17, 2, "rm", - 0x18, 0, "ro", - 0x19, 1, "ru", - 0x1a, 0, "sr", - 0x1b, 0, "sk", - 0x1c, 0, "sq", - 0x1d, 2, "sv", - 0x1e, 9, "th", - 0x1f, 4, "tr", - 0x20, 2, "ur", - 0x21, 2, "in", - 0x22, 1, "uk", - 0x23, 1, "be", - 0x24, 0, "sl", - 0x25, 7, "et", - 0x26, 7, "lv", - 0x27, 7, "lt", - 0x28, 1, "tg", - 0x29, 6, "fa", - 0x2a, 8, "vi", - 0x2b, 14, "hy", - 0x2c, 4, "az", - 0x2d, 2, "eu", -/* 0x2e, 2, "??", no ISO-639 abbreviation for Sorbian */ - 0x2f, 1, "mk", - 0x31, 2, "ts", - 0x32, 2, "tn", - 0x34, 2, "xh", - 0x35, 2, "zu", - 0x36, 2, "af", - 0x37, 14, "ka", - 0x38, 2, "fo", - 0x39, 14, "hi", - 0x3a, 14, "mt", - 0x3b, 2, "se", - 0x3c, 2, "gd", - 0x3d, 2, "yi", - 0x3e, 2, "ms", - 0x3f, 1, "kk", - 0x40, 1, "ky", - 0x41, 2, "sw", - 0x42, 0, "tk", - 0x43, 1, "uz", - 0x44, 1, "tt", - 0x45, 14, "bn", - 0x46, 14, "pa", - 0x47, 14, "gu", - 0x48, 14, "or", - 0x49, 14, "ta", - 0x4a, 14, "te", - 0x4b, 14, "kn", - 0x4c, 14, "ml", - 0x4d, 14, "as", - 0x4e, 14, "mr", - 0x4f, 14, "sa", - 0x50, 1, "mn", - 0x51, 14, "bo", - 0x52, 1, "cy", - 0x53, 14, "km", - 0x54, 14, "lo", - 0x56, 2, "gl", - 0x5b, 14, "si", - 0x5d, 14, "iu", - 0x5e, 14, "am", -/* 0x5f, 2, "??", no ISO-639 abbreviation for Tamazight */ - 0x68, 2, "ha", - 0x6a, 2, "yo", - 0x6b, 2, "qu", - 0x6d, 1, "ba", - 0x6f, 2, "kl", - 0x70, 2, "ig", -/* 0x78, 14, "??", no ISO-639 abbreviation for Yi */ - 0x7e, 2, "br", - 0x80, 6, "ug", - 0x81, 14, "mi", - 0x82, 2, "oc", - 0x83, 2, "co", -/* 0x84, 2, "??", no ISO-639 abbreviation for Alsatian */ -/* 0x85, 1, "??", no ISO-639 abbreviation for Yakut */ -/* 0x86, 2, "??", no ISO-639 abbreviation for K'iche */ - 0x87, 2, "rw", - 0x88, 2, "wo", -/* 0x8c, 6, "??", no ISO-639 abbreviation for Dari */ - /* mappings for real Windows LCID values */ - 0x0401, 6, "ar_SA", - 0x0402, 1, "bg_BG", - 0x0403, 2, "ca_ES", - 0x0404, 13, "zh_TW", - 0x0405, 0, "cs_CZ", - 0x0406, 2, "da_DK", - 0x0407, 2, "de_DE", - 0x0408, 3, "el_GR", - 0x0409, 2, "en_US", - 0x040a, 2, "es_ES", /* (traditional sort) */ - 0x040b, 2, "fi_FI", - 0x040c, 2, "fr_FR", - 0x040d, 5, "iw_IL", - 0x040e, 0, "hu_HU", - 0x040f, 2, "is_IS", - 0x0410, 2, "it_IT", - 0x0411, 10, "ja_JP", - 0x0412, 12, "ko_KR", - 0x0413, 2, "nl_NL", - 0x0414, 2, "no_NO", - 0x0415, 0, "pl_PL", - 0x0416, 2, "pt_BR", - 0x0417, 2, "rm_CH", - 0x0418, 0, "ro_RO", - 0x0419, 1, "ru_RU", - 0x041a, 0, "hr_HR", - 0x041b, 0, "sk_SK", - 0x041c, 0, "sq_AL", - 0x041d, 2, "sv_SE", - 0x041e, 9, "th_TH", - 0x041f, 4, "tr_TR", - 0x0420, 6, "ur_PK", - 0x0421, 2, "in_ID", - 0x0422, 1, "uk_UA", - 0x0423, 1, "be_BY", - 0x0424, 0, "sl_SI", - 0x0425, 7, "et_EE", - 0x0426, 7, "lv_LV", - 0x0427, 7, "lt_LT", - 0x0428, 1, "tg_TJ", - 0x0429, 6, "fa_IR", - 0x042a, 8, "vi_VN", - 0x042b, 14, "hy_AM", /* Armenian */ - 0x042c, 4, "az_AZ", /* Azeri_Latin */ - 0x042d, 2, "eu_ES", -/* 0x042e, 2, "??", no ISO-639 abbreviation for Upper Sorbian */ - 0x042f, 1, "mk_MK", -/* 0x0430, 2, "??", no ISO-639 abbreviation for Sutu */ - 0x0431, 2, "ts", /* (country?) */ - 0x0432, 2, "tn_ZA", -/* 0x0433, 2, "??", no ISO-639 abbreviation for Venda */ - 0x0434, 2, "xh_ZA", - 0x0435, 2, "zu_ZA", - 0x0436, 2, "af_ZA", - 0x0437, 14, "ka_GE", /* Georgian */ - 0x0438, 2, "fo_FO", - 0x0439, 14, "hi_IN", - 0x043a, 14, "mt_MT", - 0x043b, 2, "se_NO", /* Sami, Northern - Norway */ - 0x043c, 2, "gd_GB", - 0x043d, 2, "yi", /* (country?) */ - 0x043e, 2, "ms_MY", - 0x043f, 1, "kk_KZ", /* Kazakh */ - 0x0440, 1, "ky_KG", /* Kyrgyz */ - 0x0441, 2, "sw_KE", - 0x0442, 0, "tk_TM", - 0x0443, 4, "uz_UZ", /* Uzbek_Latin */ - 0x0444, 1, "tt_RU", /* Tatar */ - 0x0445, 14, "bn_IN", /* Bengali */ - 0x0446, 14, "pa_IN", /* Punjabi */ - 0x0447, 14, "gu_IN", /* Gujarati */ - 0x0448, 14, "or_IN", /* Oriya */ - 0x0449, 14, "ta_IN", /* Tamil */ - 0x044a, 14, "te_IN", /* Telugu */ - 0x044b, 14, "kn_IN", /* Kannada */ - 0x044c, 14, "ml_IN", /* Malayalam */ - 0x044d, 14, "as_IN", /* Assamese */ - 0x044e, 14, "mr_IN", /* Marathi */ - 0x044f, 14, "sa_IN", /* Sanskrit */ - 0x0450, 1, "mn_MN", /* Mongolian */ - 0x0451, 14, "bo_CN", /* Tibetan */ - 0x0452, 2, "cy_GB", /* Welsh */ - 0x0453, 14, "km_KH", /* Khmer */ - 0x0454, 14, "lo_LA", /* Lao */ - 0x0456, 2, "gl_ES", /* Galician */ -/* 0x0457, 14, "??_IN", /* Konkani, no ISO-639 abbreviation*/ -/* 0x045a, 14, "??_SY", /* Syriac, no ISO-639 abbreviation*/ - 0x045b, 14, "si_LK", /* Sinhala */ - 0x045d, 14, "iu_CA", /* Inuktitut */ - 0x045e, 14, "am_ET", /* Amharic */ - 0x0461, 14, "ne_NP", /* Nepali */ - 0x0462, 2, "fy_NL", /* Frisian */ - 0x0463, 6, "ps_AF", /* Pushto */ -/* 0x0464, 2, "??_PH", /* Filipino, no ISO-639 abbreviation*/ - 0x0465, 14, "dv_MV", /* Divehi */ - 0x0468, 2, "ha_NG", /* Hausa */ - 0x046a, 2, "yo_NG", /* Yoruba */ - 0x046b, 2, "qu_BO", /* Quechua - Bolivia */ -/* 0x046c, 2, "??_ZA", /* Northern Sotho, no ISO-639 abbreviation */ - 0x046d, 1, "ba_RU", /* Bashkir */ - 0x046e, 2, "lb_LU", /* Luxembourgish */ - 0x046f, 2, "kl_GL", /* Greenlandic */ - 0x0470, 2, "ig_NG", /* Igbo */ -/* 0x0478, 14, "??_CN", /* Yi (PRC), no ISO-639 abbreviation */ -/* 0x047a, 2, "??_CL", /* Mapudungun (Araucanian), no ISO-639 abbreviation */ -/* 0x047c, 2, "??_CA", /* Mohawk, no ISO-639 abbreviation */ - 0x047e, 2, "br_FR", /* Breton */ - 0x0480, 6, "ug_CN", /* Uighur */ - 0x0481, 14, "mi_NZ", /* Maori - New Zealand */ - 0x0482, 2, "oc_FR", /* Occitan */ - 0x0483, 2, "co_FR", /* Corsican */ -/* 0x0484, 2, "??_FR", /* Alsatian, no ISO-639 abbreviation */ -/* 0x0485, 1, "??_RU", /* Yakut, no ISO-639 abbreviation */ -/* 0x0486, 2, "??_GT", /* K'iche, no ISO-639 abbreviation */ - 0x0487, 2, "rw_RW", /* Kinyarwanda */ - 0x0488, 2, "wo_SN", /* Wolof */ -/* 0x048c, 6, "??_AF", /* Dari, no ISO-639 abbreviation */ - 0x0801, 6, "ar_IQ", - 0x0804, 11, "zh_CN", - 0x0807, 2, "de_CH", - 0x0809, 2, "en_GB", - 0x080a, 2, "es_MX", - 0x080c, 2, "fr_BE", - 0x0810, 2, "it_CH", - 0x0812, 15, "ko_KR", /* Korean(Johab)*/ - 0x0813, 2, "nl_BE", - 0x0814, 2, "no_NO_NY", - 0x0816, 2, "pt_PT", - 0x0818, 0, "ro_MD", - 0x0819, 1, "ru_MD", - 0x081a, 0, "sr_CS", - 0x081d, 2, "sv_FI", - 0x082c, 1, "az_AZ", /* Azeri_Cyrillic */ -/* 0x082e, 2, "??", no ISO-639 abbreviation for Lower Sorbian */ - 0x083b, 2, "se_SE", /* Sami, Northern - Sweden */ - 0x083c, 2, "ga_IE", - 0x083e, 2, "ms_BN", - 0x0843, 1, "uz_UZ", /* Uzbek_Cyrillic */ - 0x0845, 14, "bn_BD", /* Bengali */ - 0x0850, 14, "mn_CN", /* Traditional Mongolian */ - 0x085d, 2, "iu_CA", /* Inuktitut */ -/* 0x085f, 2, "??_DZ", no ISO-639 abbreviation for Tamazight */ - 0x086b, 2, "qu_EC", /* Quechua - Ecuador */ - 0x0c01, 6, "ar_EG", - 0x0c04, 13, "zh_HK", - 0x0c07, 2, "de_AT", - 0x0c09, 2, "en_AU", - 0x0c0a, 2, "es_ES", /* (modern sort) */ - 0x0c0c, 2, "fr_CA", - 0x0c1a, 1, "sr_CS", - 0x0c3b, 2, "se_FI", /* Sami, Northern - Finland */ - 0x0c6b, 2, "qu_PE", /* Quechua - Peru */ - 0x1001, 6, "ar_LY", - 0x1004, 11, "zh_SG", - 0x1007, 2, "de_LU", - 0x1009, 2, "en_CA", - 0x100a, 2, "es_GT", - 0x100c, 2, "fr_CH", - 0x101a, 0, "hr_BA", -/* 0x103b, 2, "??_NO", /* Sami, Lule - Norway */ - 0x1401, 6, "ar_DZ", - 0x1404, 13, "zh_MO", - 0x1407, 2, "de_LI", - 0x1409, 2, "en_NZ", - 0x140a, 2, "es_CR", - 0x140c, 2, "fr_LU", - 0x141a, 0, "bs_BA", -/* 0x143b, 2, "??_SE", /* Sami, Lule - Sweden */ - 0x1801, 6, "ar_MA", - 0x1809, 2, "en_IE", - 0x180a, 2, "es_PA", - 0x180c, 2, "fr_MC", - 0x181a, 0, "sr_BA", -/* 0x183b, 2, "??_NO", /* Sami, Southern - Norway */ - 0x1c01, 6, "ar_TN", - 0x1c09, 2, "en_ZA", - 0x1c0a, 2, "es_DO", - 0x1c1a, 1, "sr_BA", -/* 0x1c3b, 2, "??_SE", /* Sami, Southern - Sweden */ - 0x2001, 6, "ar_OM", - 0x2009, 2, "en_JM", - 0x200a, 2, "es_VE", - 0x201a, 0, "bs_BA", /* Bosnian (Cyrillic) */ -/* 0x203b, 2, "??_FI", /* Sami, Skolt - Finland */ - 0x2401, 6, "ar_YE", - 0x2409, 2, "en", /* ("Caribbean", which could be any of many countries) */ - 0x240a, 2, "es_CO", -/* 0x243b, 2, "??_FI", /* Sami, Inari - Finland */ - 0x2801, 6, "ar_SY", - 0x2809, 2, "en_BZ", - 0x280a, 2, "es_PE", - 0x2c01, 6, "ar_JO", - 0x2c09, 2, "en_TT", - 0x2c0a, 2, "es_AR", - 0x3001, 6, "ar_LB", - 0x3009, 2, "en_ZW", - 0x300a, 2, "es_EC", - 0x3401, 6, "ar_KW", - 0x3409, 2, "en_PH", - 0x340a, 2, "es_CL", - 0x3801, 6, "ar_AE", - 0x380a, 2, "es_UY", - 0x3c01, 6, "ar_BH", - 0x3c0a, 2, "es_PY", - 0x4001, 6, "ar_QA", - 0x4009, 2, "en_IN", - 0x400a, 2, "es_BO", - 0x4409, 2, "en_MY", - 0x440a, 2, "es_SV", - 0x4809, 2, "en_SG", - 0x480a, 2, "es_HN", - 0x4c0a, 2, "es_NI", - 0x500a, 2, "es_PR", - 0x540a, 2, "es_US" -}; - -/* - * binary-search our list of LANGID values. If we don't find the - * one we're looking for, mask out the country code and try again - * with just the primary language ID - */ -static int -getLocaleEntryIndex(LANGID langID) -{ - int index = -1; - int tries = 0; - do { - int lo, hi, mid; - lo = 0; - hi = sizeof(langIDMap) / sizeof(LANGIDtoLocale); - while (index == -1 && lo < hi) { - mid = (lo + hi) / 2; - if (langIDMap[mid].langID == langID) { - index = mid; - } else if (langIDMap[mid].langID > langID) { - hi = mid; - } else { - lo = mid + 1; - } - } - langID = PRIMARYLANGID(langID); - ++tries; - } while (index == -1 && tries < 2); - - return index; -} - static char * -getEncodingInternal(int index) +getEncodingInternal(LCID lcid) { - char * ret = encoding_names[langIDMap[index].encoding]; + char * ret = malloc(16); + int codepage; + + if (GetLocaleInfo(lcid, + LOCALE_IDEFAULTANSICODEPAGE, + ret+2, 14) == 0) { + codepage = 1252; + } else { + codepage = atoi(ret+2); + } + + switch (codepage) { + case 0: + strcpy(ret, "UTF-8"); + break; + case 874: /* 9:Thai */ + case 932: /* 10:Japanese */ + case 949: /* 12:Korean Extended Wansung */ + case 950: /* 13:Chinese (Taiwan, Hongkong, Macau) */ + case 1361: /* 15:Korean Johab */ + ret[0] = 'M'; + ret[1] = 'S'; + break; + case 936: + strcpy(ret, "GBK"); + break; + case 54936: + strcpy(ret, "GB18030"); + break; + default: + ret[0] = 'C'; + ret[1] = 'p'; + break; + } //Traditional Chinese Windows should use MS950_HKSCS_XP as the //default encoding, if HKSCS patch has been installed. @@ -460,7 +95,7 @@ getEncodingInternal(int index) WCHAR unicodeChar; MultiByteToWideChar(CP_ACP, 0, mbChar, 2, &unicodeChar, 1); if (unicodeChar == 0x92db) { - ret = "MS950_HKSCS_XP"; + strcpy(ret, "MS950_HKSCS_XP"); } } else { //SimpChinese Windows should use GB18030 as the default @@ -476,7 +111,7 @@ getEncodingInternal(int index) strcat(systemPath, "\\FONTS\\SimSun18030.ttc"); if ((f = fopen(systemPath, "r")) != NULL) { fclose(f); - ret = "GB18030"; + strcpy(ret, "GB18030"); } } } @@ -489,25 +124,35 @@ getEncodingInternal(int index) DllExport const char * getEncodingFromLangID(LANGID langID) { - int index = getLocaleEntryIndex(langID); - - if (index != (-1)) { - return getEncodingInternal(index); - } else { - return "Cp1252"; - } + return getEncodingInternal(MAKELCID(langID, SORT_DEFAULT)); } DllExport const char * getJavaIDFromLangID(LANGID langID) { - int index = getLocaleEntryIndex(langID); + char * lang; + char * ctry; + char * vrnt; + char * enc; + char * ret = malloc(16); - if (index != (-1)) { - return langIDMap[index].javaID; + SetupI18nProps(MAKELCID(langID, SORT_DEFAULT), &lang, &ctry, &vrnt, &enc); + if (ctry[0] != '\0') { + if (vrnt[0] != '\0') { + sprintf(ret, "%s_%s_%s", lang, ctry, vrnt); + } else { + sprintf(ret, "%s_%s", lang, ctry); + } } else { - return NULL; + strcpy(ret, lang); } + + free(lang); + free(ctry); + free(vrnt); + free(enc); + + return ret; } /* @@ -644,6 +289,58 @@ cpu_isalist(void) return NULL; } +#define PROPSIZE 3 // two-letter + null terminator +static void +SetupI18nProps(LCID lcid, char** language, char** country, + char** variant, char** encoding) { + /* country */ + *country = malloc(PROPSIZE); + if (GetLocaleInfo(lcid, + LOCALE_SISO3166CTRYNAME, *country, PROPSIZE) == 0) { + (*country)[0] = '\0'; + } + + /* language */ + *language = malloc(PROPSIZE); + if (lcid == 0x46c) { + /* Windows returns non-existent language code "ns" for Northern Sotho. + * Defaults to en_US + */ + strcpy(*language, "en"); + strcpy(*country, "US"); + } else if (GetLocaleInfo(lcid, + LOCALE_SISO639LANGNAME, *language, PROPSIZE) == 0) { + if (lcid == 0x465) { + /* for some reason, Windows returns "div" for this Divehi LCID, even though + * there is a two letter language code "dv". Tweak it here. + */ + strcpy(*language, "dv"); + strcpy(*country, "MV"); + } else { + /* defaults to en_US */ + strcpy(*language, "en"); + strcpy(*country, "US"); + } + } + + /* variant */ + *variant = malloc(PROPSIZE); + (*variant)[0] = '\0'; + + /* handling for Norwegian */ + if (strcmp(*language, "nb") == 0) { + strcpy(*language, "no"); + strcpy(*country , "NO"); + } else if (strcmp(*language, "nn") == 0) { + strcpy(*language, "no"); + strcpy(*country , "NO"); + strcpy(*variant, "NY"); + } + + /* encoding */ + *encoding = getEncodingInternal(lcid); +} + java_props_t * GetJavaProperties(JNIEnv* env) { @@ -876,62 +573,31 @@ GetJavaProperties(JNIEnv* env) * query the system for the current system default locale * (which is a Windows LCID value), */ - LANGID langID = LANGIDFROMLCID(GetUserDefaultLCID()); - LANGID sysLangID = LANGIDFROMLCID(GetSystemDefaultLCID()); + LCID userDefaultLCID = GetUserDefaultLCID(); + LCID systemDefaultLCID = GetSystemDefaultLCID(); + LCID userDefaultUILang = GetUserDefaultUILanguage(); { - int index = getLocaleEntryIndex(langID); + char * display_encoding; - /* - * if we didn't find the LCID that the system returned to us, - * we don't have a Java locale ID that corresponds to it. - * Fall back on en_US. - */ - if (index == -1) { - sprops.language = "en"; - sprops.country = "US"; - sprops.encoding = "Cp1252"; - } else { + SetupI18nProps(userDefaultUILang, + &sprops.language, + &sprops.country, + &sprops.variant, + &display_encoding); + SetupI18nProps(userDefaultLCID, + &sprops.format_language, + &sprops.format_country, + &sprops.format_variant, + &sprops.encoding); + SetupI18nProps(userDefaultUILang, + &sprops.display_language, + &sprops.display_country, + &sprops.display_variant, + &display_encoding); - /* otherwise, look up the corresponding Java locale ID from - * the list of Java locale IDs and set up the system properties - * accordingly. - */ - - char* lang; - char* ctry; - char* variant; - - lang = strdup(langIDMap[index].javaID); - ctry = lang; - - while (*ctry != '_' && *ctry != 0) - ++ctry; - - if (*ctry == '_') { - *ctry++ = 0; - } - - variant = ctry; - while (*variant != '_' && *variant != 0) - ++variant; - - if (*variant == '_') { - *variant++ = 0; - } - - sprops.language = lang; - sprops.country = ctry; - sprops.variant = variant; - sprops.encoding = getEncodingInternal(index); - } - index = getLocaleEntryIndex(sysLangID); - if (index == -1) { - sprops.sun_jnu_encoding = "Cp1252"; - } else { - sprops.sun_jnu_encoding = getEncodingInternal(index); - } - if (langID == 0x0c04 && ver.dwMajorVersion == 6) { + sprops.sun_jnu_encoding = getEncodingInternal(systemDefaultLCID); + if (LANGIDFROMLCID(userDefaultLCID) == 0x0c04 && ver.dwMajorVersion == 6) { // MS claims "Vista has built-in support for HKSCS-2004. // All of the HKSCS-2004 characters have Unicode 4.1. // PUA code point assignments". But what it really means diff --git a/jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp b/jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp index cb564454fac..fee6bbdb651 100644 --- a/jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp +++ b/jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp @@ -201,6 +201,7 @@ AwtDataTransferer::LCIDToTextEncoding(JNIEnv *env, LCID lcid) { throw std::bad_alloc(); } env->SetByteArrayRegion(retval, 0, length, (jbyte *)encoding); + free((void *)encoding); return retval; } diff --git a/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp b/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp index b9c6088c5a8..c93edc3621b 100644 --- a/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp +++ b/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp @@ -296,7 +296,9 @@ JNIEXPORT jobject JNICALL Java_sun_awt_windows_WInputMethod_getNativeLocale // so we can reset this flag. g_bUserHasChangedInputLang = FALSE; - return CreateLocaleObject(env, javaLocaleName); + jobject ret = CreateLocaleObject(env, javaLocaleName); + free((void *)javaLocaleName); + return ret; } else { return NULL; } @@ -323,6 +325,7 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WInputMethod_setNativeLocale const char * requested = env->GetStringUTFChars(localeString, &isCopy); if ((current != NULL) && (strcmp(current, requested) == 0)) { env->ReleaseStringUTFChars(localeString, requested); + free((void *)current); return JNI_TRUE; } @@ -352,6 +355,7 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WInputMethod_setNativeLocale env->ReleaseStringUTFChars(localeString, requested); free(hKLList); + free((void *)current); return retValue; CATCH_BAD_ALLOC_RET(JNI_FALSE); @@ -480,6 +484,7 @@ JNIEXPORT jobjectArray JNICALL Java_sun_awt_windows_WInputMethodDescriptor_getNa env->SetObjectArrayElement(locales, current, CreateLocaleObject(env, javaLocaleNames[current])); + free((void *)javaLocaleNames[current]); } DASSERT(!safe_ExceptionOccurred(env)); diff --git a/jdk/test/java/util/Formatter/Constructors.java b/jdk/test/java/util/Formatter/Constructors.java index b670e359100..c5b6f11007b 100644 --- a/jdk/test/java/util/Formatter/Constructors.java +++ b/jdk/test/java/util/Formatter/Constructors.java @@ -58,7 +58,7 @@ public class Constructors { } static void locale(Formatter f) { - locale(f, Locale.getDefault()); + locale(f, Locale.getDefault(Locale.Category.FORMAT)); } static void locale(Formatter f, Locale l) { diff --git a/jdk/test/java/util/Locale/LocaleCategory.sh b/jdk/test/java/util/Locale/LocaleCategory.sh new file mode 100644 index 00000000000..7ed214d9cde --- /dev/null +++ b/jdk/test/java/util/Locale/LocaleCategory.sh @@ -0,0 +1,79 @@ +#!/bin/sh +# +# @test +# @bug 4700857 +# @summary tests for Locale.getDefault(Locale.Category) and +# Locale.setDefault(Locale.Category, Locale) +# @build LocaleCategory +# @run shell/timeout=600 LocaleCategory.sh + +if [ "${TESTSRC}" = "" ] +then + echo "TESTSRC not set. Test cannot execute. Failed." + exit 1 +fi +echo "TESTSRC=${TESTSRC}" +if [ "${TESTJAVA}" = "" ] +then + echo "TESTJAVA not set. Test cannot execute. Failed." + exit 1 +fi +echo "TESTJAVA=${TESTJAVA}" +if [ "${TESTCLASSES}" = "" ] +then + echo "TESTCLASSES not set. Test cannot execute. Failed." + exit 1 +fi +echo "TESTCLASSES=${TESTCLASSES}" +echo "CLASSPATH=${CLASSPATH}" + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + SunOS | Linux ) + PS=":" + FS="/" + ;; + Windows* ) + PS=";" + FS="\\" + ;; + * ) + echo "Unrecognized system!" + exit 1; + ;; +esac + +# test user.xxx.display user.xxx.format properties + +# run +RUNCMD="${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} -Duser.language.display=ja -Duser.language.format=zh LocaleCategory" + +echo ${RUNCMD} +${RUNCMD} +result=$? + +if [ $result -eq 0 ] +then + echo "Execution successful" +else + echo "Execution of the test case failed." +fi + +# test user.xxx properties overriding user.xxx.display/format + +# run +RUNCMD="${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} -Duser.language=en -Duser.language.display=ja -Duser.language.format=zh LocaleCategory" + +echo ${RUNCMD} +${RUNCMD} +result=$? + +if [ $result -eq 0 ] +then + echo "Execution successful" +else + echo "Execution of the test case failed." +fi + +exit $result diff --git a/jdk/test/java/util/Locale/PrintDefaultLocale.java b/jdk/test/java/util/Locale/PrintDefaultLocale.java index 06beaefd778..04f39abd370 100644 --- a/jdk/test/java/util/Locale/PrintDefaultLocale.java +++ b/jdk/test/java/util/Locale/PrintDefaultLocale.java @@ -231,8 +231,15 @@ import java.util.Locale; public class PrintDefaultLocale { public static void main(String[] args) { - System.out.println(Locale.getDefault().toString()); - System.out.println(Locale.getDefault().getDisplayName(Locale.US)); - System.out.println(Charset.defaultCharset()); + System.out.printf("default locale: ID: %s, Name: %s\n", + Locale.getDefault().toString(), + Locale.getDefault().getDisplayName(Locale.US)); + System.out.printf("display locale: ID: %s, Name: %s\n", + Locale.getDefault(Locale.Category.DISPLAY).toString(), + Locale.getDefault(Locale.Category.DISPLAY).getDisplayName(Locale.US)); + System.out.printf("format locale: ID: %s, Name: %s\n", + Locale.getDefault(Locale.Category.FORMAT).toString(), + Locale.getDefault(Locale.Category.FORMAT).getDisplayName(Locale.US)); + System.out.printf("default charset: %s\n", Charset.defaultCharset()); } } diff --git a/jdk/test/java/util/Locale/data/deflocale.c b/jdk/test/java/util/Locale/data/deflocale.c index 9f461ef9197..f1ab060dff6 100644 --- a/jdk/test/java/util/Locale/data/deflocale.c +++ b/jdk/test/java/util/Locale/data/deflocale.c @@ -29,100 +29,233 @@ * WARNING: This tool directly modifies the locale info in the Windows registry. * It may not work with the Windows versions after Windows XP SP2. Also, * if the test did not complete or was manually killed, you will need to reset - * the user default locale in the Control Panel manually. + * the user default locale in the Control Panel manually. This executable has + * to be run with the "Administrator" privilege. * * Usage: "deflocale.exe PrintDefaultLocale * - * How to compile: "cl deflocale.c advapi32.lib" + * How to compile: "cl -DUNICODE -D_UNICODE deflocale.c user32.lib advapi32.lib" */ #include #include #include -char* launcher; -char szBuffer[MAX_PATH]; +wchar_t* launcher; +wchar_t szBuffer[MAX_PATH]; LCID LCIDArray[1024]; int numLCIDs = 0; +BOOL isWin7orUp = FALSE; -void testLCID(int anLCID) { +// for Windows 7 +BOOL (WINAPI * pfnEnumSystemLocalesEx)(LPVOID, DWORD, LPARAM, LPVOID); +BOOL (WINAPI * pfnEnumUILanguages)(LPVOID, DWORD, LPARAM); +LCID (WINAPI * pfnLocaleNameToLCID)(LPCWSTR, DWORD); +int (WINAPI * pfnLCIDToLocaleName)(LCID, LPWSTR, int, DWORD); +wchar_t* LocaleNamesArray[1024]; +wchar_t* UILangNamesArray[1024]; +int numLocaleNames = 0; +int numUILangNames = 0; + +void launchAndWait() { + STARTUPINFO si; + PROCESS_INFORMATION pi; + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + if (CreateProcess(NULL, launcher, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)==0) { + wprintf(L"CreateProcess failed with the error code: %x\n", GetLastError()); + } + + WaitForSingleObject( pi.hProcess, INFINITE ); +} + +void testLocale(int anLCID, wchar_t* pName) { HKEY hk; - printf("\n"); - printf("OS Locale (lcid: %x): ", anLCID); + if (pName != NULL && wcslen(pName) == 2) { + // ignore language only locale. + return; + } + + wprintf(L"\n"); + wprintf(L"OS Locale (lcid: %x", anLCID); + if (pName != NULL) { + wprintf(L", name: %s", pName); + } GetLocaleInfo(anLCID, LOCALE_SENGLANGUAGE, szBuffer, MAX_PATH); - printf("%s (", szBuffer); + wprintf(L"): %s (", szBuffer); GetLocaleInfo(anLCID, LOCALE_SENGCOUNTRY, szBuffer, MAX_PATH); - printf("%s) - ", szBuffer); + wprintf(L"%s) - ", szBuffer); GetLocaleInfo(anLCID, LOCALE_IDEFAULTANSICODEPAGE, szBuffer, MAX_PATH); - printf("%s\n", szBuffer); + wprintf(L"%s\n", szBuffer); fflush(0); - if (RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\International", 0, KEY_READ | KEY_WRITE, &hk) == ERROR_SUCCESS) { - BYTE original[16]; - BYTE test[16]; - DWORD cb = 16; - STARTUPINFO si; - PROCESS_INFORMATION pi; + if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Control Panel\\International", 0, KEY_READ | KEY_WRITE, &hk) == ERROR_SUCCESS) { + wchar_t originalLocale[16]; + wchar_t testLocale[16]; + wchar_t* pKeyName; + DWORD cb = sizeof(originalLocale); + DWORD cbTest; - RegQueryValueEx(hk, "Locale", 0, 0, original, &cb); - sprintf(test, "%08x", anLCID); - RegSetValueEx(hk, "Locale", 0, REG_SZ, test, cb); - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - if (CreateProcess(NULL, launcher, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)==0) { - printf("CreateProcess failed with the error code: %x\n", GetLastError()); + if (isWin7orUp) { + pKeyName = L"LocaleName"; + wcscpy(testLocale, pName); + cbTest = wcslen(pName) * sizeof(wchar_t); + } else { + pKeyName = L"Locale"; + swprintf(testLocale, L"%08x", anLCID); + cbTest = sizeof(wchar_t) * 8; } - WaitForSingleObject( pi.hProcess, INFINITE ); - - RegSetValueEx(hk, "Locale", 0, REG_SZ, original, cb); + RegQueryValueEx(hk, pKeyName, 0, 0, (LPBYTE)originalLocale, &cb); + RegSetValueEx(hk, pKeyName, 0, REG_SZ, (LPBYTE)testLocale, cbTest ); + launchAndWait(); + RegSetValueEx(hk, pKeyName, 0, REG_SZ, (LPBYTE)originalLocale, cb); RegCloseKey(hk); } } -BOOL CALLBACK EnumLocaleProc(LPTSTR lpLocaleStr) { - sscanf(lpLocaleStr, "%08x", &LCIDArray[numLCIDs]); +void testUILang(wchar_t* pName) { + HKEY hk; + + wprintf(L"\n"); + wprintf(L"OS UI Language (name: %s)\n", pName); + fflush(0); + + if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Control Panel\\Desktop", 0, KEY_READ | KEY_WRITE, &hk) == ERROR_SUCCESS) { + wchar_t originalUILang[16]; + wchar_t testUILang[16]; + wchar_t* pKeyName; + DWORD cb = sizeof(originalUILang); + DWORD cbTest = wcslen(pName) * sizeof(wchar_t); + + pKeyName = L"PreferredUILanguages"; + wcscpy(testUILang, pName); + cbTest = wcslen(pName) * sizeof(wchar_t); + + RegQueryValueEx(hk, pKeyName, 0, 0, (LPBYTE)originalUILang, &cb); + RegSetValueEx(hk, pKeyName, 0, REG_SZ, (LPBYTE)testUILang, cbTest); + launchAndWait(); + RegSetValueEx(hk, pKeyName, 0, REG_SZ, (LPBYTE)originalUILang, cb); + RegCloseKey(hk); + } +} + +BOOL CALLBACK EnumLocalesProc(LPWSTR lpLocaleStr) { + swscanf(lpLocaleStr, L"%08x", &LCIDArray[numLCIDs]); numLCIDs ++; return TRUE; } +BOOL CALLBACK EnumLocalesProcEx(LPWSTR lpLocaleStr, DWORD flags, LPARAM lp) { + wchar_t* pName = malloc((wcslen(lpLocaleStr) + 1) * sizeof(wchar_t *)); + wcscpy(pName, lpLocaleStr); + LocaleNamesArray[numLocaleNames] = pName; + numLocaleNames ++; + + return TRUE; +} + +BOOL CALLBACK EnumUILanguagesProc(LPWSTR lpUILangStr, LPARAM lp) { + wchar_t* pName = malloc((wcslen(lpUILangStr) + 1) * sizeof(wchar_t *)); + wcscpy(pName, lpUILangStr); + UILangNamesArray[numUILangNames] = pName; + numUILangNames ++; + + return TRUE; +} + int sortLCIDs(LCID * pLCID1, LCID * pLCID2) { if (*pLCID1 < *pLCID2) return (-1); if (*pLCID1 == *pLCID2) return 0; - if (*pLCID1 > *pLCID2) return 1; + return 1; +} + +int sortLocaleNames(wchar_t** ppName1, wchar_t** ppName2) { + LCID l1 = pfnLocaleNameToLCID(*ppName1, 0); + LCID l2 = pfnLocaleNameToLCID(*ppName2, 0); + return sortLCIDs(&l1, &l2); } int main(int argc, char** argv) { OSVERSIONINFO osvi; - LPTSTR commandline = GetCommandLine(); + LPWSTR commandline = GetCommandLine(); int i; osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionEx(&osvi); - printf("# OSVersionInfo\n"); - printf("# MajorVersion: %d\n", osvi.dwMajorVersion); - printf("# MinorVersion: %d\n", osvi.dwMinorVersion); - printf("# BuildNumber: %d\n", osvi.dwBuildNumber); - printf("# CSDVersion: %s\n", osvi.szCSDVersion); - printf("\n"); + wprintf(L"# OSVersionInfo\n"); + wprintf(L"# MajorVersion: %d\n", osvi.dwMajorVersion); + wprintf(L"# MinorVersion: %d\n", osvi.dwMinorVersion); + wprintf(L"# BuildNumber: %d\n", osvi.dwBuildNumber); + wprintf(L"# CSDVersion: %s\n", osvi.szCSDVersion); + wprintf(L"\n"); fflush(0); - launcher = strchr(commandline, ' ')+1; - while (*launcher == ' ') { + launcher = wcschr(commandline, L' ')+1; + while (*launcher == L' ') { launcher++; } - // Enumerate locales - EnumSystemLocales(EnumLocaleProc, LCID_INSTALLED); + isWin7orUp = (osvi.dwMajorVersion > 6) || + (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion >= 1); - // Sort LCIDs - qsort(LCIDArray, numLCIDs, sizeof(LCID), (void *)sortLCIDs); + if (!isWin7orUp) { + // Enumerate locales + EnumSystemLocales(EnumLocalesProc, LCID_INSTALLED); + + // Sort LCIDs + qsort(LCIDArray, numLCIDs, sizeof(LCID), (void *)sortLCIDs); + } else { + // For Windows 7, use "LocaleName" registry key for the user locale + // as they seem to switch from "Locale". + HMODULE hmod = GetModuleHandle(L"kernel32"); + *(FARPROC*)&pfnEnumSystemLocalesEx = + GetProcAddress(hmod, "EnumSystemLocalesEx"); + *(FARPROC*)&pfnEnumUILanguages = + GetProcAddress(hmod, "EnumUILanguagesW"); + *(FARPROC*)&pfnLocaleNameToLCID = + GetProcAddress(hmod, "LocaleNameToLCID"); + *(FARPROC*)&pfnLCIDToLocaleName = + GetProcAddress(hmod, "LCIDToLocaleName"); + if (pfnEnumSystemLocalesEx != NULL && + pfnEnumUILanguages != NULL && + pfnLocaleNameToLCID != NULL && + pfnLCIDToLocaleName != NULL) { + // Enumerate locales + pfnEnumSystemLocalesEx(EnumLocalesProcEx, + 1, // LOCALE_WINDOWS + (LPARAM)NULL, NULL); + // Enumerate UI Languages. + pfnEnumUILanguages(EnumUILanguagesProc, + 0x8, // MUI_LANGUAGE_NAME + (LPARAM)NULL); + } else { + wprintf(L"Could not get needed entry points. quitting.\n"); + exit(-1); + } + + // Sort LocaleNames + qsort(LocaleNamesArray, numLocaleNames, + sizeof(wchar_t*), (void *)sortLocaleNames); + qsort(UILangNamesArray, numUILangNames, + sizeof(wchar_t*), (void *)sortLocaleNames); + } // Execute enumeration of Java default locales - for (i = 0; i < numLCIDs; i ++) { - testLCID(LCIDArray[i]); + if (isWin7orUp) { + for (i = 0; i < numLocaleNames; i ++) { + testLocale(pfnLocaleNameToLCID(LocaleNamesArray[i], 0), + LocaleNamesArray[i]); + } + for (i = 0; i < numUILangNames; i ++) { + testUILang(UILangNamesArray[i]); + } + } else { + for (i = 0; i < numLCIDs; i ++) { + testLocale(LCIDArray[i], NULL); + } } } diff --git a/jdk/test/java/util/Locale/data/deflocale.input b/jdk/test/java/util/Locale/data/deflocale.input new file mode 100644 index 00000000000..a2906c3254e --- /dev/null +++ b/jdk/test/java/util/Locale/data/deflocale.input @@ -0,0 +1,7 @@ +# data file for deflocale.sh. Each line must have two locales in the following order. +# +# LC_CTYPE LC_MESSAGES + + ja_JP.UTF-8 zh_CN.UTF-8 + zh_CN.UTF-8 en_US.UTF-8 + C zh_CN.UTF-8 diff --git a/jdk/test/java/util/Locale/data/deflocale.jds3 b/jdk/test/java/util/Locale/data/deflocale.jds3 deleted file mode 100644 index 74b5435a4c4..00000000000 --- a/jdk/test/java/util/Locale/data/deflocale.jds3 +++ /dev/null @@ -1,1793 +0,0 @@ -Sun Java Desktop System, Release 3 - build 36 -Assembled 23 May 2005 -Linux dnm-dtf-012 2.6.5-7.139-default #1 Fri Jan 14 15:41:33 UTC 2005 i686 i686 i386 GNU/Linux - -OS Locale: aa_DJ -aa_DJ -Afar (Djibouti) -ISO-8859-1 - -OS Locale: aa_ER -aa_ER -Afar (Eritrea) -UTF-8 - -OS Locale: aa_ER.utf8 -aa_ER -Afar (Eritrea) -UTF-8 - -OS Locale: aa_ER@saaho -aa_ER -Afar (Eritrea) -UTF-8 - -OS Locale: aa_ET -aa_ET -Afar (Ethiopia) -UTF-8 - -OS Locale: aa_ET.utf8 -aa_ET -Afar (Ethiopia) -UTF-8 - -OS Locale: af_ZA -af_ZA -Afrikaans (South Africa) -ISO-8859-1 - -OS Locale: am_ET -am_ET -Amharic (Ethiopia) -UTF-8 - -OS Locale: am_ET.utf8 -am_ET -Amharic (Ethiopia) -UTF-8 - -OS Locale: an_ES -an_ES -Aragonese (Spain) -ISO-8859-15 - -OS Locale: ar_AE -ar_AE -Arabic (United Arab Emirates) -ISO-8859-6 - -OS Locale: ar_AE.utf8 -ar_AE -Arabic (United Arab Emirates) -UTF-8 - -OS Locale: ar_BH -ar_BH -Arabic (Bahrain) -ISO-8859-6 - -OS Locale: ar_BH.utf8 -ar_BH -Arabic (Bahrain) -UTF-8 - -OS Locale: ar_DZ -ar_DZ -Arabic (Algeria) -ISO-8859-6 - -OS Locale: ar_DZ.utf8 -ar_DZ -Arabic (Algeria) -UTF-8 - -OS Locale: ar_EG -ar_EG -Arabic (Egypt) -ISO-8859-6 - -OS Locale: ar_EG.utf8 -ar_EG -Arabic (Egypt) -UTF-8 - -OS Locale: ar_IN -ar_IN -Arabic (India) -UTF-8 - -OS Locale: ar_IN.utf8 -ar_IN -Arabic (India) -UTF-8 - -OS Locale: ar_IQ -ar_IQ -Arabic (Iraq) -ISO-8859-6 - -OS Locale: ar_IQ.utf8 -ar_IQ -Arabic (Iraq) -UTF-8 - -OS Locale: ar_JO -ar_JO -Arabic (Jordan) -ISO-8859-6 - -OS Locale: ar_JO.utf8 -ar_JO -Arabic (Jordan) -UTF-8 - -OS Locale: ar_KW -ar_KW -Arabic (Kuwait) -ISO-8859-6 - -OS Locale: ar_KW.utf8 -ar_KW -Arabic (Kuwait) -UTF-8 - -OS Locale: ar_LB -ar_LB -Arabic (Lebanon) -ISO-8859-6 - -OS Locale: ar_LB.utf8 -ar_LB -Arabic (Lebanon) -UTF-8 - -OS Locale: ar_LY -ar_LY -Arabic (Libya) -ISO-8859-6 - -OS Locale: ar_LY.utf8 -ar_LY -Arabic (Libya) -UTF-8 - -OS Locale: ar_MA -ar_MA -Arabic (Morocco) -ISO-8859-6 - -OS Locale: ar_MA.utf8 -ar_MA -Arabic (Morocco) -UTF-8 - -OS Locale: ar_OM -ar_OM -Arabic (Oman) -ISO-8859-6 - -OS Locale: ar_OM.utf8 -ar_OM -Arabic (Oman) -UTF-8 - -OS Locale: ar_QA -ar_QA -Arabic (Qatar) -ISO-8859-6 - -OS Locale: ar_QA.utf8 -ar_QA -Arabic (Qatar) -UTF-8 - -OS Locale: ar_SA -ar_SA -Arabic (Saudi Arabia) -ISO-8859-6 - -OS Locale: ar_SA.utf8 -ar_SA -Arabic (Saudi Arabia) -UTF-8 - -OS Locale: ar_SD -ar_SD -Arabic (Sudan) -ISO-8859-6 - -OS Locale: ar_SD.utf8 -ar_SD -Arabic (Sudan) -UTF-8 - -OS Locale: ar_SY -ar_SY -Arabic (Syria) -ISO-8859-6 - -OS Locale: ar_SY.utf8 -ar_SY -Arabic (Syria) -UTF-8 - -OS Locale: ar_TN -ar_TN -Arabic (Tunisia) -ISO-8859-6 - -OS Locale: ar_TN.utf8 -ar_TN -Arabic (Tunisia) -UTF-8 - -OS Locale: ar_YE -ar_YE -Arabic (Yemen) -ISO-8859-6 - -OS Locale: ar_YE.utf8 -ar_YE -Arabic (Yemen) -UTF-8 - -OS Locale: az_AZ.utf8 -az_AZ -Azerbaijani (Azerbaijan) -UTF-8 - -OS Locale: be_BY -be_BY -Belarusian (Belarus) -windows-1251 - -OS Locale: be_BY.utf8 -be_BY -Belarusian (Belarus) -UTF-8 - -OS Locale: bg_BG -bg_BG -Bulgarian (Bulgaria) -windows-1251 - -OS Locale: bg_BG.utf8 -bg_BG -Bulgarian (Bulgaria) -UTF-8 - -OS Locale: bn_BD -bn_BD -Bengali (Bangladesh) -UTF-8 - -OS Locale: bn_BD.utf8 -bn_BD -Bengali (Bangladesh) -UTF-8 - -OS Locale: bn_IN -bn_IN -Bengali (India) -UTF-8 - -OS Locale: bn_IN.utf8 -bn_IN -Bengali (India) -UTF-8 - -OS Locale: br_FR -br_FR -Breton (France) -ISO-8859-1 - -OS Locale: br_FR@euro -br_FR -Breton (France) -ISO-8859-15 - -OS Locale: bs_BA -bs_BA -Bosnian (Bosnia and Herzegovina) -ISO-8859-2 - -OS Locale: byn_ER -en_ER -English (Eritrea) -UTF-8 - -OS Locale: byn_ER.utf8 -en_ER -English (Eritrea) -UTF-8 - -OS Locale: ca_ES -ca_ES -Catalan (Spain) -ISO-8859-1 - -OS Locale: ca_ES.utf8 -ca_ES -Catalan (Spain) -UTF-8 - -OS Locale: ca_ES@euro -ca_ES -Catalan (Spain) -ISO-8859-15 - -OS Locale: cs_CZ -cs_CZ -Czech (Czech Republic) -ISO-8859-2 - -OS Locale: cs_CZ.utf8 -cs_CZ -Czech (Czech Republic) -UTF-8 - -OS Locale: cy_GB -cy_GB -Welsh (United Kingdom) -UTF-8 - -OS Locale: cy_GB.utf8 -cy_GB -Welsh (United Kingdom) -UTF-8 - -OS Locale: da_DK -da_DK -Danish (Denmark) -ISO-8859-1 - -OS Locale: da_DK.utf8 -da_DK -Danish (Denmark) -UTF-8 - -OS Locale: da_DK@euro -da_DK -Danish (Denmark) -ISO-8859-1 - -OS Locale: de_AT -de_AT -German (Austria) -ISO-8859-1 - -OS Locale: de_AT.utf8 -de_AT -German (Austria) -UTF-8 - -OS Locale: de_AT@euro -de_AT -German (Austria) -ISO-8859-15 - -OS Locale: de_BE -de_BE -German (Belgium) -ISO-8859-1 - -OS Locale: de_BE.utf8 -de_BE -German (Belgium) -UTF-8 - -OS Locale: de_BE@euro -de_BE -German (Belgium) -ISO-8859-15 - -OS Locale: de_CH -de_CH -German (Switzerland) -ISO-8859-1 - -OS Locale: de_CH.utf8 -de_CH -German (Switzerland) -UTF-8 - -OS Locale: de_DE -de_DE -German (Germany) -ISO-8859-1 - -OS Locale: de_DE.utf8 -de_DE -German (Germany) -UTF-8 - -OS Locale: de_DE@euro -de_DE -German (Germany) -ISO-8859-15 - -OS Locale: de_LU -de_LU -German (Luxembourg) -ISO-8859-1 - -OS Locale: de_LU.utf8 -de_LU -German (Luxembourg) -UTF-8 - -OS Locale: de_LU@euro -de_LU -German (Luxembourg) -ISO-8859-15 - -OS Locale: el_GR -el_GR -Greek (Greece) -ISO-8859-7 - -OS Locale: el_GR.utf8 -el_GR -Greek (Greece) -UTF-8 - -OS Locale: en_AU -en_AU -English (Australia) -ISO-8859-1 - -OS Locale: en_AU.utf8 -en_AU -English (Australia) -UTF-8 - -OS Locale: en_BE -en_BE -English (Belgium) -ISO-8859-1 - -OS Locale: en_BE.utf8 -en_BE -English (Belgium) -UTF-8 - -OS Locale: en_BE@euro -en_BE -English (Belgium) -ISO-8859-15 - -OS Locale: en_BW -en_BW -English (Botswana) -ISO-8859-1 - -OS Locale: en_BW.utf8 -en_BW -English (Botswana) -UTF-8 - -OS Locale: en_CA -en_CA -English (Canada) -ISO-8859-1 - -OS Locale: en_CA.utf8 -en_CA -English (Canada) -UTF-8 - -OS Locale: en_DK -en_DK -English (Denmark) -ISO-8859-1 - -OS Locale: en_DK.utf8 -en_DK -English (Denmark) -UTF-8 - -OS Locale: en_GB -en_GB -English (United Kingdom) -ISO-8859-1 - -OS Locale: en_GB.iso885915 -en_GB -English (United Kingdom) -ISO-8859-15 - -OS Locale: en_GB.utf8 -en_GB -English (United Kingdom) -UTF-8 - -OS Locale: en_HK -en_HK -English (Hong Kong) -ISO-8859-1 - -OS Locale: en_HK.utf8 -en_HK -English (Hong Kong) -UTF-8 - -OS Locale: en_IE -en_IE -English (Ireland) -ISO-8859-1 - -OS Locale: en_IE.utf8 -en_IE -English (Ireland) -UTF-8 - -OS Locale: en_IE@euro -en_IE -English (Ireland) -ISO-8859-15 - -OS Locale: en_IN -en_IN -English (India) -UTF-8 - -OS Locale: en_NZ -en_NZ -English (New Zealand) -ISO-8859-1 - -OS Locale: en_NZ.utf8 -en_NZ -English (New Zealand) -UTF-8 - -OS Locale: en_PH -en_PH -English (Philippines) -ISO-8859-1 - -OS Locale: en_PH.utf8 -en_PH -English (Philippines) -UTF-8 - -OS Locale: en_SG -en_SG -English (Singapore) -ISO-8859-1 - -OS Locale: en_SG.utf8 -en_SG -English (Singapore) -UTF-8 - -OS Locale: en_US -en_US -English (United States) -ISO-8859-1 - -OS Locale: en_US.iso885915 -en_US -English (United States) -ISO-8859-15 - -OS Locale: en_US.utf8 -en_US -English (United States) -UTF-8 - -OS Locale: en_ZA -en_ZA -English (South Africa) -ISO-8859-1 - -OS Locale: en_ZA.utf8 -en_ZA -English (South Africa) -UTF-8 - -OS Locale: en_ZW -en_ZW -English (Zimbabwe) -ISO-8859-1 - -OS Locale: en_ZW.utf8 -en_ZW -English (Zimbabwe) -UTF-8 - -OS Locale: es_AR -es_AR -Spanish (Argentina) -ISO-8859-1 - -OS Locale: es_AR.utf8 -es_AR -Spanish (Argentina) -UTF-8 - -OS Locale: es_BO -es_BO -Spanish (Bolivia) -ISO-8859-1 - -OS Locale: es_BO.utf8 -es_BO -Spanish (Bolivia) -UTF-8 - -OS Locale: es_CL -es_CL -Spanish (Chile) -ISO-8859-1 - -OS Locale: es_CL.utf8 -es_CL -Spanish (Chile) -UTF-8 - -OS Locale: es_CO -es_CO -Spanish (Colombia) -ISO-8859-1 - -OS Locale: es_CO.utf8 -es_CO -Spanish (Colombia) -UTF-8 - -OS Locale: es_CR -es_CR -Spanish (Costa Rica) -ISO-8859-1 - -OS Locale: es_CR.utf8 -es_CR -Spanish (Costa Rica) -UTF-8 - -OS Locale: es_DO -es_DO -Spanish (Dominican Republic) -ISO-8859-1 - -OS Locale: es_DO.utf8 -es_DO -Spanish (Dominican Republic) -UTF-8 - -OS Locale: es_EC -es_EC -Spanish (Ecuador) -ISO-8859-1 - -OS Locale: es_EC.utf8 -es_EC -Spanish (Ecuador) -UTF-8 - -OS Locale: es_ES -es_ES -Spanish (Spain) -ISO-8859-1 - -OS Locale: es_ES.utf8 -es_ES -Spanish (Spain) -UTF-8 - -OS Locale: es_ES@euro -es_ES -Spanish (Spain) -ISO-8859-15 - -OS Locale: es_GT -es_GT -Spanish (Guatemala) -ISO-8859-1 - -OS Locale: es_GT.utf8 -es_GT -Spanish (Guatemala) -UTF-8 - -OS Locale: es_HN -es_HN -Spanish (Honduras) -ISO-8859-1 - -OS Locale: es_HN.utf8 -es_HN -Spanish (Honduras) -UTF-8 - -OS Locale: es_MX -es_MX -Spanish (Mexico) -ISO-8859-1 - -OS Locale: es_MX.utf8 -es_MX -Spanish (Mexico) -UTF-8 - -OS Locale: es_NI -es_NI -Spanish (Nicaragua) -ISO-8859-1 - -OS Locale: es_NI.utf8 -es_NI -Spanish (Nicaragua) -UTF-8 - -OS Locale: es_PA -es_PA -Spanish (Panama) -ISO-8859-1 - -OS Locale: es_PA.utf8 -es_PA -Spanish (Panama) -UTF-8 - -OS Locale: es_PE -es_PE -Spanish (Peru) -ISO-8859-1 - -OS Locale: es_PE.utf8 -es_PE -Spanish (Peru) -UTF-8 - -OS Locale: es_PR -es_PR -Spanish (Puerto Rico) -ISO-8859-1 - -OS Locale: es_PR.utf8 -es_PR -Spanish (Puerto Rico) -UTF-8 - -OS Locale: es_PY -es_PY -Spanish (Paraguay) -ISO-8859-1 - -OS Locale: es_PY.utf8 -es_PY -Spanish (Paraguay) -UTF-8 - -OS Locale: es_SV -es_SV -Spanish (El Salvador) -ISO-8859-1 - -OS Locale: es_SV.utf8 -es_SV -Spanish (El Salvador) -UTF-8 - -OS Locale: es_US -es_US -Spanish (United States) -ISO-8859-1 - -OS Locale: es_US.utf8 -es_US -Spanish (United States) -UTF-8 - -OS Locale: es_UY -es_UY -Spanish (Uruguay) -ISO-8859-1 - -OS Locale: es_UY.utf8 -es_UY -Spanish (Uruguay) -UTF-8 - -OS Locale: es_VE -es_VE -Spanish (Venezuela) -ISO-8859-1 - -OS Locale: es_VE.utf8 -es_VE -Spanish (Venezuela) -UTF-8 - -OS Locale: et_EE -et_EE -Estonian (Estonia) -ISO-8859-1 - -OS Locale: et_EE.iso885915 -et_EE -Estonian (Estonia) -ISO-8859-15 - -OS Locale: et_EE.utf8 -et_EE -Estonian (Estonia) -UTF-8 - -OS Locale: eu_ES -eu_ES -Basque (Spain) -ISO-8859-1 - -OS Locale: eu_ES.utf8 -eu_ES -Basque (Spain) -UTF-8 - -OS Locale: eu_ES@euro -eu_ES -Basque (Spain) -ISO-8859-15 - -OS Locale: fa_IR -fa_IR -Persian (Iran) -UTF-8 - -OS Locale: fa_IR.utf8 -fa_IR -Persian (Iran) -UTF-8 - -OS Locale: fi_FI -fi_FI -Finnish (Finland) -ISO-8859-1 - -OS Locale: fi_FI.utf8 -fi_FI -Finnish (Finland) -UTF-8 - -OS Locale: fi_FI@euro -fi_FI -Finnish (Finland) -ISO-8859-15 - -OS Locale: fo_FO -fo_FO -Faroese (Faroe Islands) -ISO-8859-1 - -OS Locale: fo_FO.utf8 -fo_FO -Faroese (Faroe Islands) -UTF-8 - -OS Locale: fr_BE -fr_BE -French (Belgium) -ISO-8859-1 - -OS Locale: fr_BE.utf8 -fr_BE -French (Belgium) -UTF-8 - -OS Locale: fr_BE@euro -fr_BE -French (Belgium) -ISO-8859-15 - -OS Locale: fr_CA -fr_CA -French (Canada) -ISO-8859-1 - -OS Locale: fr_CA.utf8 -fr_CA -French (Canada) -UTF-8 - -OS Locale: fr_CH -fr_CH -French (Switzerland) -ISO-8859-1 - -OS Locale: fr_CH.utf8 -fr_CH -French (Switzerland) -UTF-8 - -OS Locale: fr_FR -fr_FR -French (France) -ISO-8859-1 - -OS Locale: fr_FR.utf8 -fr_FR -French (France) -UTF-8 - -OS Locale: fr_FR@euro -fr_FR -French (France) -ISO-8859-15 - -OS Locale: fr_LU -fr_LU -French (Luxembourg) -ISO-8859-1 - -OS Locale: fr_LU.utf8 -fr_LU -French (Luxembourg) -UTF-8 - -OS Locale: fr_LU@euro -fr_LU -French (Luxembourg) -ISO-8859-15 - -OS Locale: ga_IE -ga_IE -Irish (Ireland) -ISO-8859-1 - -OS Locale: ga_IE.utf8 -ga_IE -Irish (Ireland) -UTF-8 - -OS Locale: ga_IE@euro -ga_IE -Irish (Ireland) -ISO-8859-15 - -OS Locale: gd_GB -gd_GB -Scottish Gaelic (United Kingdom) -ISO-8859-15 - -OS Locale: gez_ER -en_ER -English (Eritrea) -UTF-8 - -OS Locale: gez_ER@abegede -en_ER -English (Eritrea) -UTF-8 - -OS Locale: gez_ET -en_ET -English (Ethiopia) -UTF-8 - -OS Locale: gez_ET@abegede -en_ET -English (Ethiopia) -UTF-8 - -OS Locale: gl_ES -gl_ES -Gallegan (Spain) -ISO-8859-1 - -OS Locale: gl_ES.utf8 -gl_ES -Gallegan (Spain) -UTF-8 - -OS Locale: gl_ES@euro -gl_ES -Gallegan (Spain) -ISO-8859-15 - -OS Locale: gu_IN -gu_IN -Gujarati (India) -UTF-8 - -OS Locale: gv_GB -gv_GB -Manx (United Kingdom) -ISO-8859-1 - -OS Locale: gv_GB.utf8 -gv_GB -Manx (United Kingdom) -UTF-8 - -OS Locale: he_IL -iw_IL -Hebrew (Israel) -ISO-8859-8 - -OS Locale: he_IL.utf8 -iw_IL -Hebrew (Israel) -UTF-8 - -OS Locale: hi_IN -hi_IN -Hindi (India) -UTF-8 - -OS Locale: hi_IN.utf8 -hi_IN -Hindi (India) -UTF-8 - -OS Locale: hr_HR -hr_HR -Croatian (Croatia) -ISO-8859-2 - -OS Locale: hr_HR.utf8 -hr_HR -Croatian (Croatia) -UTF-8 - -OS Locale: hu_HU -hu_HU -Hungarian (Hungary) -ISO-8859-2 - -OS Locale: hu_HU.utf8 -hu_HU -Hungarian (Hungary) -UTF-8 - -OS Locale: id_ID -in_ID -Indonesian (Indonesia) -ISO-8859-1 - -OS Locale: id_ID.utf8 -in_ID -Indonesian (Indonesia) -UTF-8 - -OS Locale: is_IS -is_IS -Icelandic (Iceland) -ISO-8859-1 - -OS Locale: is_IS.utf8 -is_IS -Icelandic (Iceland) -UTF-8 - -OS Locale: it_CH -it_CH -Italian (Switzerland) -ISO-8859-1 - -OS Locale: it_CH.utf8 -it_CH -Italian (Switzerland) -UTF-8 - -OS Locale: it_IT -it_IT -Italian (Italy) -ISO-8859-1 - -OS Locale: it_IT.utf8 -it_IT -Italian (Italy) -UTF-8 - -OS Locale: it_IT@euro -it_IT -Italian (Italy) -ISO-8859-15 - -OS Locale: iw_IL -iw_IL -Hebrew (Israel) -ISO-8859-8 - -OS Locale: iw_IL.utf8 -iw_IL -Hebrew (Israel) -UTF-8 - -OS Locale: ja_JP.eucjp -ja_JP -Japanese (Japan) -x-euc-jp-linux - -OS Locale: ja_JP.sjis -ja_JP -Japanese (Japan) -Shift_JIS - -OS Locale: ja_JP.utf8 -ja_JP -Japanese (Japan) -UTF-8 - -OS Locale: ka_GE -ka_GE -Georgian (Georgia) -UTF-8 - -OS Locale: kk_KZ -kk_KZ -Kazakh (Kazakhstan) -UTF-8 - -OS Locale: kl_GL -kl_GL -Greenlandic (Greenland) -ISO-8859-1 - -OS Locale: kl_GL.utf8 -kl_GL -Greenlandic (Greenland) -UTF-8 - -OS Locale: kn_IN -kn_IN -Kannada (India) -UTF-8 - -OS Locale: ko_KR.euckr -ko_KR -Korean (South Korea) -EUC-KR - -OS Locale: ko_KR.utf8 -ko_KR -Korean (South Korea) -UTF-8 - -OS Locale: kw_GB -kw_GB -Cornish (United Kingdom) -ISO-8859-1 - -OS Locale: kw_GB.utf8 -kw_GB -Cornish (United Kingdom) -UTF-8 - -OS Locale: lg_UG -lg_UG -Ganda (Uganda) -UTF-8 - -OS Locale: lo_LA -lo_LA -Lao (Laos) -UTF-8 - -OS Locale: lt_LT -lt_LT -Lithuanian (Lithuania) -ISO-8859-13 - -OS Locale: lt_LT.utf8 -lt_LT -Lithuanian (Lithuania) -UTF-8 - -OS Locale: lv_LV -lv_LV -Latvian (Latvia) -ISO-8859-13 - -OS Locale: lv_LV.utf8 -lv_LV -Latvian (Latvia) -UTF-8 - -OS Locale: mi_NZ -mi_NZ -Maori (New Zealand) -ISO-8859-13 - -OS Locale: mk_MK -mk_MK -Macedonian (Macedonia) -ISO-8859-5 - -OS Locale: mk_MK.utf8 -mk_MK -Macedonian (Macedonia) -UTF-8 - -OS Locale: ml_IN -ml_IN -Malayalam (India) -UTF-8 - -OS Locale: ml_IN.utf8 -ml_IN -Malayalam (India) -UTF-8 - -OS Locale: mn_MN -mn_MN -Mongolian (Mongolia) -UTF-8 - -OS Locale: mn_MN.utf8 -mn_MN -Mongolian (Mongolia) -UTF-8 - -OS Locale: mr_IN -mr_IN -Marathi (India) -UTF-8 - -OS Locale: mr_IN.utf8 -mr_IN -Marathi (India) -UTF-8 - -OS Locale: ms_MY -ms_MY -Malay (Malaysia) -ISO-8859-1 - -OS Locale: ms_MY.utf8 -ms_MY -Malay (Malaysia) -UTF-8 - -OS Locale: mt_MT -mt_MT -Maltese (Malta) -ISO-8859-3 - -OS Locale: mt_MT.utf8 -mt_MT -Maltese (Malta) -UTF-8 - -OS Locale: nb_NO -nb_NO -Norwegian Bokmål (Norway) -ISO-8859-1 - -OS Locale: nb_NO.utf8 -nb_NO -Norwegian BokmÃ¥l (Norway) -UTF-8 - -OS Locale: ne_NP -ne_NP -Nepali (Nepal) -UTF-8 - -OS Locale: ne_NP.utf8 -ne_NP -Nepali (Nepal) -UTF-8 - -OS Locale: nl_BE -nl_BE -Dutch (Belgium) -ISO-8859-1 - -OS Locale: nl_BE.utf8 -nl_BE -Dutch (Belgium) -UTF-8 - -OS Locale: nl_BE@euro -nl_BE -Dutch (Belgium) -ISO-8859-15 - -OS Locale: nl_NL -nl_NL -Dutch (Netherlands) -ISO-8859-1 - -OS Locale: nl_NL.utf8 -nl_NL -Dutch (Netherlands) -UTF-8 - -OS Locale: nl_NL@euro -nl_NL -Dutch (Netherlands) -ISO-8859-15 - -OS Locale: nn_NO -nn_NO -Norwegian Nynorsk (Norway) -ISO-8859-1 - -OS Locale: nn_NO.utf8 -nn_NO -Norwegian Nynorsk (Norway) -UTF-8 - -OS Locale: no_NO -no_NO -Norwegian (Norway) -ISO-8859-1 - -OS Locale: no_NO.utf8 -no_NO -Norwegian (Norway) -UTF-8 - -OS Locale: oc_FR -oc_FR -Occitan (France) -ISO-8859-1 - -OS Locale: om_ET -om_ET -Oromo (Ethiopia) -UTF-8 - -OS Locale: om_ET.utf8 -om_ET -Oromo (Ethiopia) -UTF-8 - -OS Locale: om_KE -om_KE -Oromo (Kenya) -ISO-8859-1 - -OS Locale: pa_IN -pa_IN -Panjabi (India) -UTF-8 - -OS Locale: pa_IN.utf8 -pa_IN -Panjabi (India) -UTF-8 - -OS Locale: pl_PL -pl_PL -Polish (Poland) -ISO-8859-2 - -OS Locale: pl_PL.utf8 -pl_PL -Polish (Poland) -UTF-8 - -OS Locale: pt_BR -pt_BR -Portuguese (Brazil) -ISO-8859-1 - -OS Locale: pt_BR.utf8 -pt_BR -Portuguese (Brazil) -UTF-8 - -OS Locale: pt_PT -pt_PT -Portuguese (Portugal) -ISO-8859-1 - -OS Locale: pt_PT.utf8 -pt_PT -Portuguese (Portugal) -UTF-8 - -OS Locale: pt_PT@euro -pt_PT -Portuguese (Portugal) -ISO-8859-15 - -OS Locale: ro_RO -ro_RO -Romanian (Romania) -ISO-8859-2 - -OS Locale: ro_RO.utf8 -ro_RO -Romanian (Romania) -UTF-8 - -OS Locale: ru_RU -ru_RU -Russian (Russia) -ISO-8859-5 - -OS Locale: ru_RU.koi8r -ru_RU -Russian (Russia) -KOI8-R - -OS Locale: ru_RU.utf8 -ru_RU -Russian (Russia) -UTF-8 - -OS Locale: ru_UA -ru_UA -Russian (Ukraine) -KOI8-U - -OS Locale: ru_UA.utf8 -ru_UA -Russian (Ukraine) -UTF-8 - -OS Locale: se_NO -se_NO -Northern Sami (Norway) -UTF-8 - -OS Locale: se_NO.utf8 -se_NO -Northern Sami (Norway) -UTF-8 - -OS Locale: sh_YU -sr_CS -Serbian (Serbia and Montenegro) -ISO-8859-2 - -OS Locale: sh_YU.utf8 -sr_CS -Serbian (Serbia and Montenegro) -UTF-8 - -OS Locale: sid_ET -en_ET -English (Ethiopia) -UTF-8 - -OS Locale: sid_ET.utf8 -en_ET -English (Ethiopia) -UTF-8 - -OS Locale: sk_SK -sk_SK -Slovak (Slovakia) -ISO-8859-2 - -OS Locale: sk_SK.utf8 -sk_SK -Slovak (Slovakia) -UTF-8 - -OS Locale: sl_SI -sl_SI -Slovenian (Slovenia) -ISO-8859-2 - -OS Locale: sl_SI.utf8 -sl_SI -Slovenian (Slovenia) -UTF-8 - -OS Locale: so_DJ -so_DJ -Somali (Djibouti) -ISO-8859-1 - -OS Locale: so_ET -so_ET -Somali (Ethiopia) -UTF-8 - -OS Locale: so_ET.utf8 -so_ET -Somali (Ethiopia) -UTF-8 - -OS Locale: so_KE -so_KE -Somali (Kenya) -ISO-8859-1 - -OS Locale: so_SO -so_SO -Somali (Somalia) -ISO-8859-1 - -OS Locale: sq_AL -sq_AL -Albanian (Albania) -ISO-8859-1 - -OS Locale: sq_AL.utf8 -sq_AL -Albanian (Albania) -UTF-8 - -OS Locale: sr_YU -sr_CS -Serbian (Serbia and Montenegro) -ISO-8859-2 - -OS Locale: sr_YU.utf8 -sr_CS -Serbian (Serbia and Montenegro) -UTF-8 - -OS Locale: sr_YU.utf8@cyrillic -sr_CS -Serbian (Serbia and Montenegro) -UTF-8 - -OS Locale: sr_YU@cyrillic -sr_CS -Serbian (Serbia and Montenegro) -ISO-8859-5 - -OS Locale: st_ZA -st_ZA -Southern Sotho (South Africa) -ISO-8859-1 - -OS Locale: st_ZA.utf8 -st_ZA -Southern Sotho (South Africa) -UTF-8 - -OS Locale: sv_FI -sv_FI -Swedish (Finland) -ISO-8859-1 - -OS Locale: sv_FI.utf8 -sv_FI -Swedish (Finland) -UTF-8 - -OS Locale: sv_FI@euro -sv_FI -Swedish (Finland) -ISO-8859-15 - -OS Locale: sv_SE -sv_SE -Swedish (Sweden) -ISO-8859-1 - -OS Locale: sv_SE.iso885915 -sv_SE -Swedish (Sweden) -ISO-8859-15 - -OS Locale: sv_SE.utf8 -sv_SE -Swedish (Sweden) -UTF-8 - -OS Locale: ta_IN -ta_IN -Tamil (India) -UTF-8 - -OS Locale: ta_IN.utf8 -ta_IN -Tamil (India) -UTF-8 - -OS Locale: te_IN -te_IN -Telugu (India) -UTF-8 - -OS Locale: te_IN.utf8 -te_IN -Telugu (India) -UTF-8 - -OS Locale: tg_TJ -tg_TJ -Tajik (Tajikistan) -UTF-8 - -OS Locale: th_TH -th_TH -Thai (Thailand) -TIS-620 - -OS Locale: th_TH.utf8 -th_TH -Thai (Thailand) -UTF-8 - -OS Locale: ti_ER -ti_ER -Tigrinya (Eritrea) -UTF-8 - -OS Locale: ti_ER.utf8 -ti_ER -Tigrinya (Eritrea) -UTF-8 - -OS Locale: ti_ET -ti_ET -Tigrinya (Ethiopia) -UTF-8 - -OS Locale: ti_ET.utf8 -ti_ET -Tigrinya (Ethiopia) -UTF-8 - -OS Locale: tig_ER -en_ER -English (Eritrea) -UTF-8 - -OS Locale: tig_ER.utf8 -en_ER -English (Eritrea) -UTF-8 - -OS Locale: tl_PH -tl_PH -Tagalog (Philippines) -ISO-8859-1 - -OS Locale: tr_TR -tr_TR -Turkish (Turkey) -ISO-8859-9 - -OS Locale: tr_TR.utf8 -tr_TR -Turkish (Turkey) -UTF-8 - -OS Locale: tt_RU.utf8 -tt_RU -Tatar (Russia) -UTF-8 - -OS Locale: uk_UA -uk_UA -Ukrainian (Ukraine) -KOI8-U - -OS Locale: uk_UA.utf8 -uk_UA -Ukrainian (Ukraine) -UTF-8 - -OS Locale: ur_PK -ur_PK -Urdu (Pakistan) -UTF-8 - -OS Locale: ur_PK.utf8 -ur_PK -Urdu (Pakistan) -UTF-8 - -OS Locale: uz_UZ -uz_UZ -Uzbek (Uzbekistan) -ISO-8859-1 - -OS Locale: uz_UZ@cyrillic -uz_UZ -Uzbek (Uzbekistan) -UTF-8 - -OS Locale: vi_VN -vi_VN -Vietnamese (Vietnam) -UTF-8 - -OS Locale: vi_VN.tcvn -vi_VN -Vietnamese (Vietnam) -UTF-8 - -OS Locale: vi_VN.utf8 -vi_VN -Vietnamese (Vietnam) -UTF-8 - -OS Locale: wa_BE -wa_BE -Walloon (Belgium) -ISO-8859-1 - -OS Locale: wa_BE.utf8 -wa_BE -Walloon (Belgium) -UTF-8 - -OS Locale: wa_BE@euro -wa_BE -Walloon (Belgium) -ISO-8859-15 - -OS Locale: xh_ZA -xh_ZA -Xhosa (South Africa) -ISO-8859-1 - -OS Locale: xh_ZA.utf8 -xh_ZA -Xhosa (South Africa) -UTF-8 - -OS Locale: yi_US -ji_US -Yiddish (United States) -windows-1255 - -OS Locale: zh_CN -zh_CN -Chinese (China) -GB2312 - -OS Locale: zh_CN.gb18030 -zh_CN -Chinese (China) -GB18030 - -OS Locale: zh_CN.gbk -zh_CN -Chinese (China) -GBK - -OS Locale: zh_CN.utf8 -zh_CN -Chinese (China) -UTF-8 - -OS Locale: zh_HK -zh_HK -Chinese (Hong Kong) -Big5-HKSCS - -OS Locale: zh_HK.utf8 -zh_HK -Chinese (Hong Kong) -UTF-8 - -OS Locale: zh_SG -zh_SG -Chinese (Singapore) -GB2312 - -OS Locale: zh_SG.gbk -zh_SG -Chinese (Singapore) -GBK - -OS Locale: zh_TW -zh_TW -Chinese (Taiwan) -Big5 - -OS Locale: zh_TW.euctw -zh_TW -Chinese (Taiwan) -x-EUC-TW - -OS Locale: zh_TW.utf8 -zh_TW -Chinese (Taiwan) -UTF-8 - -OS Locale: zu_ZA -zu_ZA -Zulu (South Africa) -ISO-8859-1 - -OS Locale: zu_ZA.utf8 -zu_ZA -Zulu (South Africa) -UTF-8 diff --git a/jdk/test/java/util/Locale/data/deflocale.rhel4 b/jdk/test/java/util/Locale/data/deflocale.rhel4 deleted file mode 100644 index 4c10be1789b..00000000000 --- a/jdk/test/java/util/Locale/data/deflocale.rhel4 +++ /dev/null @@ -1,1623 +0,0 @@ -LSB_VERSION="1.3" -Red Hat Enterprise Linux AS release 4 (Nahant Update 1) -Linux i18n-hp733-6.sfbay.sun.com 2.6.9-6.37.EL #1 Tue Mar 29 15:34:14 EST 2005 i686 i686 i386 GNU/Linux - -OS Locale: aa_DJ -aa_DJ -Afar (Djibouti) -ISO-8859-1 - -OS Locale: aa_ER -aa_ER -Afar (Eritrea) -UTF-8 - -OS Locale: aa_ER@saaho -aa_ER -Afar (Eritrea) -UTF-8 - -OS Locale: aa_ET -aa_ET -Afar (Ethiopia) -UTF-8 - -OS Locale: af_ZA -af_ZA -Afrikaans (South Africa) -ISO-8859-1 - -OS Locale: am_ET -am_ET -Amharic (Ethiopia) -UTF-8 - -OS Locale: an_ES -an_ES -Aragonese (Spain) -ISO-8859-15 - -OS Locale: ar_AE -ar_AE -Arabic (United Arab Emirates) -ISO-8859-6 - -OS Locale: ar_AE.utf8 -ar_AE -Arabic (United Arab Emirates) -UTF-8 - -OS Locale: ar_BH -ar_BH -Arabic (Bahrain) -ISO-8859-6 - -OS Locale: ar_BH.utf8 -ar_BH -Arabic (Bahrain) -UTF-8 - -OS Locale: ar_DZ -ar_DZ -Arabic (Algeria) -ISO-8859-6 - -OS Locale: ar_DZ.utf8 -ar_DZ -Arabic (Algeria) -UTF-8 - -OS Locale: ar_EG -ar_EG -Arabic (Egypt) -ISO-8859-6 - -OS Locale: ar_EG.utf8 -ar_EG -Arabic (Egypt) -UTF-8 - -OS Locale: ar_IN -ar_IN -Arabic (India) -UTF-8 - -OS Locale: ar_IQ -ar_IQ -Arabic (Iraq) -ISO-8859-6 - -OS Locale: ar_IQ.utf8 -ar_IQ -Arabic (Iraq) -UTF-8 - -OS Locale: ar_JO -ar_JO -Arabic (Jordan) -ISO-8859-6 - -OS Locale: ar_JO.utf8 -ar_JO -Arabic (Jordan) -UTF-8 - -OS Locale: ar_KW -ar_KW -Arabic (Kuwait) -ISO-8859-6 - -OS Locale: ar_KW.utf8 -ar_KW -Arabic (Kuwait) -UTF-8 - -OS Locale: ar_LB -ar_LB -Arabic (Lebanon) -ISO-8859-6 - -OS Locale: ar_LB.utf8 -ar_LB -Arabic (Lebanon) -UTF-8 - -OS Locale: ar_LY -ar_LY -Arabic (Libya) -ISO-8859-6 - -OS Locale: ar_LY.utf8 -ar_LY -Arabic (Libya) -UTF-8 - -OS Locale: ar_MA -ar_MA -Arabic (Morocco) -ISO-8859-6 - -OS Locale: ar_MA.utf8 -ar_MA -Arabic (Morocco) -UTF-8 - -OS Locale: ar_OM -ar_OM -Arabic (Oman) -ISO-8859-6 - -OS Locale: ar_OM.utf8 -ar_OM -Arabic (Oman) -UTF-8 - -OS Locale: ar_QA -ar_QA -Arabic (Qatar) -ISO-8859-6 - -OS Locale: ar_QA.utf8 -ar_QA -Arabic (Qatar) -UTF-8 - -OS Locale: ar_SA -ar_SA -Arabic (Saudi Arabia) -ISO-8859-6 - -OS Locale: ar_SA.utf8 -ar_SA -Arabic (Saudi Arabia) -UTF-8 - -OS Locale: ar_SD -ar_SD -Arabic (Sudan) -ISO-8859-6 - -OS Locale: ar_SD.utf8 -ar_SD -Arabic (Sudan) -UTF-8 - -OS Locale: ar_SY -ar_SY -Arabic (Syria) -ISO-8859-6 - -OS Locale: ar_SY.utf8 -ar_SY -Arabic (Syria) -UTF-8 - -OS Locale: ar_TN -ar_TN -Arabic (Tunisia) -ISO-8859-6 - -OS Locale: ar_TN.utf8 -ar_TN -Arabic (Tunisia) -UTF-8 - -OS Locale: ar_YE -ar_YE -Arabic (Yemen) -ISO-8859-6 - -OS Locale: ar_YE.utf8 -ar_YE -Arabic (Yemen) -UTF-8 - -OS Locale: az_AZ.utf8 -az_AZ -Azerbaijani (Azerbaijan) -UTF-8 - -OS Locale: be_BY -be_BY -Belarusian (Belarus) -windows-1251 - -OS Locale: be_BY.utf8 -be_BY -Belarusian (Belarus) -UTF-8 - -OS Locale: bg_BG -bg_BG -Bulgarian (Bulgaria) -windows-1251 - -OS Locale: bg_BG.utf8 -bg_BG -Bulgarian (Bulgaria) -UTF-8 - -OS Locale: bn_BD -bn_BD -Bengali (Bangladesh) -UTF-8 - -OS Locale: bn_IN -bn_IN -Bengali (India) -UTF-8 - -OS Locale: br_FR -br_FR -Breton (France) -ISO-8859-1 - -OS Locale: br_FR@euro -br_FR -Breton (France) -ISO-8859-15 - -OS Locale: bs_BA -bs_BA -Bosnian (Bosnia and Herzegovina) -ISO-8859-2 - -OS Locale: byn_ER -en_ER -English (Eritrea) -UTF-8 - -OS Locale: ca_ES -ca_ES -Catalan (Spain) -ISO-8859-1 - -OS Locale: ca_ES.utf8 -ca_ES -Catalan (Spain) -UTF-8 - -OS Locale: ca_ES@euro -ca_ES -Catalan (Spain) -ISO-8859-15 - -OS Locale: cs_CZ -cs_CZ -Czech (Czech Republic) -ISO-8859-2 - -OS Locale: cs_CZ.utf8 -cs_CZ -Czech (Czech Republic) -UTF-8 - -OS Locale: cy_GB -cy_GB -Welsh (United Kingdom) -UTF-8 - -OS Locale: cy_GB.utf8 -cy_GB -Welsh (United Kingdom) -UTF-8 - -OS Locale: da_DK -da_DK -Danish (Denmark) -ISO-8859-1 - -OS Locale: da_DK.iso885915 -da_DK -Danish (Denmark) -ISO-8859-15 - -OS Locale: da_DK.utf8 -da_DK -Danish (Denmark) -UTF-8 - -OS Locale: de_AT -de_AT -German (Austria) -ISO-8859-1 - -OS Locale: de_AT.utf8 -de_AT -German (Austria) -UTF-8 - -OS Locale: de_AT@euro -de_AT -German (Austria) -ISO-8859-15 - -OS Locale: de_BE -de_BE -German (Belgium) -ISO-8859-1 - -OS Locale: de_BE.utf8 -de_BE -German (Belgium) -UTF-8 - -OS Locale: de_BE@euro -de_BE -German (Belgium) -ISO-8859-15 - -OS Locale: de_CH -de_CH -German (Switzerland) -ISO-8859-1 - -OS Locale: de_CH.utf8 -de_CH -German (Switzerland) -UTF-8 - -OS Locale: de_DE -de_DE -German (Germany) -ISO-8859-1 - -OS Locale: de_DE.utf8 -de_DE -German (Germany) -UTF-8 - -OS Locale: de_DE@euro -de_DE -German (Germany) -ISO-8859-15 - -OS Locale: de_LU -de_LU -German (Luxembourg) -ISO-8859-1 - -OS Locale: de_LU.utf8 -de_LU -German (Luxembourg) -UTF-8 - -OS Locale: de_LU@euro -de_LU -German (Luxembourg) -ISO-8859-15 - -OS Locale: el_GR -el_GR -Greek (Greece) -ISO-8859-7 - -OS Locale: el_GR.utf8 -el_GR -Greek (Greece) -UTF-8 - -OS Locale: en_AU -en_AU -English (Australia) -ISO-8859-1 - -OS Locale: en_AU.utf8 -en_AU -English (Australia) -UTF-8 - -OS Locale: en_BW -en_BW -English (Botswana) -ISO-8859-1 - -OS Locale: en_BW.utf8 -en_BW -English (Botswana) -UTF-8 - -OS Locale: en_CA -en_CA -English (Canada) -ISO-8859-1 - -OS Locale: en_CA.utf8 -en_CA -English (Canada) -UTF-8 - -OS Locale: en_DK -en_DK -English (Denmark) -ISO-8859-1 - -OS Locale: en_DK.utf8 -en_DK -English (Denmark) -UTF-8 - -OS Locale: en_GB -en_GB -English (United Kingdom) -ISO-8859-1 - -OS Locale: en_GB.iso885915 -en_GB -English (United Kingdom) -ISO-8859-15 - -OS Locale: en_GB.utf8 -en_GB -English (United Kingdom) -UTF-8 - -OS Locale: en_HK -en_HK -English (Hong Kong) -ISO-8859-1 - -OS Locale: en_HK.utf8 -en_HK -English (Hong Kong) -UTF-8 - -OS Locale: en_IE -en_IE -English (Ireland) -ISO-8859-1 - -OS Locale: en_IE.utf8 -en_IE -English (Ireland) -UTF-8 - -OS Locale: en_IE@euro -en_IE -English (Ireland) -ISO-8859-15 - -OS Locale: en_IN -en_IN -English (India) -UTF-8 - -OS Locale: en_NZ -en_NZ -English (New Zealand) -ISO-8859-1 - -OS Locale: en_NZ.utf8 -en_NZ -English (New Zealand) -UTF-8 - -OS Locale: en_PH -en_PH -English (Philippines) -ISO-8859-1 - -OS Locale: en_PH.utf8 -en_PH -English (Philippines) -UTF-8 - -OS Locale: en_SG -en_SG -English (Singapore) -ISO-8859-1 - -OS Locale: en_SG.utf8 -en_SG -English (Singapore) -UTF-8 - -OS Locale: en_US -en_US -English (United States) -ISO-8859-1 - -OS Locale: en_US.iso885915 -en_US -English (United States) -ISO-8859-15 - -OS Locale: en_US.utf8 -en_US -English (United States) -UTF-8 - -OS Locale: en_ZA -en_ZA -English (South Africa) -ISO-8859-1 - -OS Locale: en_ZA.utf8 -en_ZA -English (South Africa) -UTF-8 - -OS Locale: en_ZW -en_ZW -English (Zimbabwe) -ISO-8859-1 - -OS Locale: en_ZW.utf8 -en_ZW -English (Zimbabwe) -UTF-8 - -OS Locale: es_AR -es_AR -Spanish (Argentina) -ISO-8859-1 - -OS Locale: es_AR.utf8 -es_AR -Spanish (Argentina) -UTF-8 - -OS Locale: es_BO -es_BO -Spanish (Bolivia) -ISO-8859-1 - -OS Locale: es_BO.utf8 -es_BO -Spanish (Bolivia) -UTF-8 - -OS Locale: es_CL -es_CL -Spanish (Chile) -ISO-8859-1 - -OS Locale: es_CL.utf8 -es_CL -Spanish (Chile) -UTF-8 - -OS Locale: es_CO -es_CO -Spanish (Colombia) -ISO-8859-1 - -OS Locale: es_CO.utf8 -es_CO -Spanish (Colombia) -UTF-8 - -OS Locale: es_CR -es_CR -Spanish (Costa Rica) -ISO-8859-1 - -OS Locale: es_CR.utf8 -es_CR -Spanish (Costa Rica) -UTF-8 - -OS Locale: es_DO -es_DO -Spanish (Dominican Republic) -ISO-8859-1 - -OS Locale: es_DO.utf8 -es_DO -Spanish (Dominican Republic) -UTF-8 - -OS Locale: es_EC -es_EC -Spanish (Ecuador) -ISO-8859-1 - -OS Locale: es_EC.utf8 -es_EC -Spanish (Ecuador) -UTF-8 - -OS Locale: es_ES -es_ES -Spanish (Spain) -ISO-8859-1 - -OS Locale: es_ES.utf8 -es_ES -Spanish (Spain) -UTF-8 - -OS Locale: es_ES@euro -es_ES -Spanish (Spain) -ISO-8859-15 - -OS Locale: es_GT -es_GT -Spanish (Guatemala) -ISO-8859-1 - -OS Locale: es_GT.utf8 -es_GT -Spanish (Guatemala) -UTF-8 - -OS Locale: es_HN -es_HN -Spanish (Honduras) -ISO-8859-1 - -OS Locale: es_HN.utf8 -es_HN -Spanish (Honduras) -UTF-8 - -OS Locale: es_MX -es_MX -Spanish (Mexico) -ISO-8859-1 - -OS Locale: es_MX.utf8 -es_MX -Spanish (Mexico) -UTF-8 - -OS Locale: es_NI -es_NI -Spanish (Nicaragua) -ISO-8859-1 - -OS Locale: es_NI.utf8 -es_NI -Spanish (Nicaragua) -UTF-8 - -OS Locale: es_PA -es_PA -Spanish (Panama) -ISO-8859-1 - -OS Locale: es_PA.utf8 -es_PA -Spanish (Panama) -UTF-8 - -OS Locale: es_PE -es_PE -Spanish (Peru) -ISO-8859-1 - -OS Locale: es_PE.utf8 -es_PE -Spanish (Peru) -UTF-8 - -OS Locale: es_PR -es_PR -Spanish (Puerto Rico) -ISO-8859-1 - -OS Locale: es_PR.utf8 -es_PR -Spanish (Puerto Rico) -UTF-8 - -OS Locale: es_PY -es_PY -Spanish (Paraguay) -ISO-8859-1 - -OS Locale: es_PY.utf8 -es_PY -Spanish (Paraguay) -UTF-8 - -OS Locale: es_SV -es_SV -Spanish (El Salvador) -ISO-8859-1 - -OS Locale: es_SV.utf8 -es_SV -Spanish (El Salvador) -UTF-8 - -OS Locale: es_US -es_US -Spanish (United States) -ISO-8859-1 - -OS Locale: es_US.utf8 -es_US -Spanish (United States) -UTF-8 - -OS Locale: es_UY -es_UY -Spanish (Uruguay) -ISO-8859-1 - -OS Locale: es_UY.utf8 -es_UY -Spanish (Uruguay) -UTF-8 - -OS Locale: es_VE -es_VE -Spanish (Venezuela) -ISO-8859-1 - -OS Locale: es_VE.utf8 -es_VE -Spanish (Venezuela) -UTF-8 - -OS Locale: et_EE -et_EE -Estonian (Estonia) -ISO-8859-1 - -OS Locale: et_EE.iso885915 -et_EE -Estonian (Estonia) -ISO-8859-15 - -OS Locale: et_EE.utf8 -et_EE -Estonian (Estonia) -UTF-8 - -OS Locale: eu_ES -eu_ES -Basque (Spain) -ISO-8859-1 - -OS Locale: eu_ES.utf8 -eu_ES -Basque (Spain) -UTF-8 - -OS Locale: eu_ES@euro -eu_ES -Basque (Spain) -ISO-8859-15 - -OS Locale: fa_IR -fa_IR -Persian (Iran) -UTF-8 - -OS Locale: fi_FI -fi_FI -Finnish (Finland) -ISO-8859-1 - -OS Locale: fi_FI.utf8 -fi_FI -Finnish (Finland) -UTF-8 - -OS Locale: fi_FI@euro -fi_FI -Finnish (Finland) -ISO-8859-15 - -OS Locale: fo_FO -fo_FO -Faroese (Faroe Islands) -ISO-8859-1 - -OS Locale: fo_FO.utf8 -fo_FO -Faroese (Faroe Islands) -UTF-8 - -OS Locale: fr_BE -fr_BE -French (Belgium) -ISO-8859-1 - -OS Locale: fr_BE.utf8 -fr_BE -French (Belgium) -UTF-8 - -OS Locale: fr_BE@euro -fr_BE -French (Belgium) -ISO-8859-15 - -OS Locale: fr_CA -fr_CA -French (Canada) -ISO-8859-1 - -OS Locale: fr_CA.utf8 -fr_CA -French (Canada) -UTF-8 - -OS Locale: fr_CH -fr_CH -French (Switzerland) -ISO-8859-1 - -OS Locale: fr_CH.utf8 -fr_CH -French (Switzerland) -UTF-8 - -OS Locale: fr_FR -fr_FR -French (France) -ISO-8859-1 - -OS Locale: fr_FR.utf8 -fr_FR -French (France) -UTF-8 - -OS Locale: fr_FR@euro -fr_FR -French (France) -ISO-8859-15 - -OS Locale: fr_LU -fr_LU -French (Luxembourg) -ISO-8859-1 - -OS Locale: fr_LU.utf8 -fr_LU -French (Luxembourg) -UTF-8 - -OS Locale: fr_LU@euro -fr_LU -French (Luxembourg) -ISO-8859-15 - -OS Locale: ga_IE -ga_IE -Irish (Ireland) -ISO-8859-1 - -OS Locale: ga_IE.utf8 -ga_IE -Irish (Ireland) -UTF-8 - -OS Locale: ga_IE@euro -ga_IE -Irish (Ireland) -ISO-8859-15 - -OS Locale: gd_GB -gd_GB -Scottish Gaelic (United Kingdom) -ISO-8859-15 - -OS Locale: gez_ER -en_ER -English (Eritrea) -UTF-8 - -OS Locale: gez_ER@abegede -en_ER -English (Eritrea) -UTF-8 - -OS Locale: gez_ET -en_ET -English (Ethiopia) -UTF-8 - -OS Locale: gez_ET@abegede -en_ET -English (Ethiopia) -UTF-8 - -OS Locale: gl_ES -gl_ES -Gallegan (Spain) -ISO-8859-1 - -OS Locale: gl_ES.utf8 -gl_ES -Gallegan (Spain) -UTF-8 - -OS Locale: gl_ES@euro -gl_ES -Gallegan (Spain) -ISO-8859-15 - -OS Locale: gu_IN -gu_IN -Gujarati (India) -UTF-8 - -OS Locale: gv_GB -gv_GB -Manx (United Kingdom) -ISO-8859-1 - -OS Locale: gv_GB.utf8 -gv_GB -Manx (United Kingdom) -UTF-8 - -OS Locale: he_IL -iw_IL -Hebrew (Israel) -ISO-8859-8 - -OS Locale: he_IL.utf8 -iw_IL -Hebrew (Israel) -UTF-8 - -OS Locale: hi_IN -hi_IN -Hindi (India) -UTF-8 - -OS Locale: hr_HR -hr_HR -Croatian (Croatia) -ISO-8859-2 - -OS Locale: hr_HR.utf8 -hr_HR -Croatian (Croatia) -UTF-8 - -OS Locale: hu_HU -hu_HU -Hungarian (Hungary) -ISO-8859-2 - -OS Locale: hu_HU.utf8 -hu_HU -Hungarian (Hungary) -UTF-8 - -OS Locale: id_ID -in_ID -Indonesian (Indonesia) -ISO-8859-1 - -OS Locale: id_ID.utf8 -in_ID -Indonesian (Indonesia) -UTF-8 - -OS Locale: is_IS -is_IS -Icelandic (Iceland) -ISO-8859-1 - -OS Locale: is_IS.utf8 -is_IS -Icelandic (Iceland) -UTF-8 - -OS Locale: it_CH -it_CH -Italian (Switzerland) -ISO-8859-1 - -OS Locale: it_CH.utf8 -it_CH -Italian (Switzerland) -UTF-8 - -OS Locale: it_IT -it_IT -Italian (Italy) -ISO-8859-1 - -OS Locale: it_IT.utf8 -it_IT -Italian (Italy) -UTF-8 - -OS Locale: it_IT@euro -it_IT -Italian (Italy) -ISO-8859-15 - -OS Locale: iw_IL -iw_IL -Hebrew (Israel) -ISO-8859-8 - -OS Locale: iw_IL.utf8 -iw_IL -Hebrew (Israel) -UTF-8 - -OS Locale: ja_JP.eucjp -ja_JP -Japanese (Japan) -x-euc-jp-linux - -OS Locale: ja_JP.utf8 -ja_JP -Japanese (Japan) -UTF-8 - -OS Locale: ka_GE -ka_GE -Georgian (Georgia) -UTF-8 - -OS Locale: kk_KZ -kk_KZ -Kazakh (Kazakhstan) -UTF-8 - -OS Locale: kl_GL -kl_GL -Greenlandic (Greenland) -ISO-8859-1 - -OS Locale: kl_GL.utf8 -kl_GL -Greenlandic (Greenland) -UTF-8 - -OS Locale: kn_IN -kn_IN -Kannada (India) -UTF-8 - -OS Locale: ko_KR.euckr -ko_KR -Korean (South Korea) -EUC-KR - -OS Locale: ko_KR.utf8 -ko_KR -Korean (South Korea) -UTF-8 - -OS Locale: kw_GB -kw_GB -Cornish (United Kingdom) -ISO-8859-1 - -OS Locale: kw_GB.utf8 -kw_GB -Cornish (United Kingdom) -UTF-8 - -OS Locale: lg_UG -lg_UG -Ganda (Uganda) -UTF-8 - -OS Locale: lo_LA -lo_LA -Lao (Laos) -UTF-8 - -OS Locale: locale-archive -en_US -English (United States) -US-ASCII - -OS Locale: lt_LT -lt_LT -Lithuanian (Lithuania) -ISO-8859-13 - -OS Locale: lt_LT.utf8 -lt_LT -Lithuanian (Lithuania) -UTF-8 - -OS Locale: lv_LV -lv_LV -Latvian (Latvia) -ISO-8859-13 - -OS Locale: lv_LV.utf8 -lv_LV -Latvian (Latvia) -UTF-8 - -OS Locale: mi_NZ -mi_NZ -Maori (New Zealand) -ISO-8859-13 - -OS Locale: mk_MK -mk_MK -Macedonian (Macedonia) -ISO-8859-5 - -OS Locale: mk_MK.utf8 -mk_MK -Macedonian (Macedonia) -UTF-8 - -OS Locale: ml_IN -ml_IN -Malayalam (India) -UTF-8 - -OS Locale: mn_MN -mn_MN -Mongolian (Mongolia) -UTF-8 - -OS Locale: mr_IN -mr_IN -Marathi (India) -UTF-8 - -OS Locale: ms_MY -ms_MY -Malay (Malaysia) -ISO-8859-1 - -OS Locale: ms_MY.utf8 -ms_MY -Malay (Malaysia) -UTF-8 - -OS Locale: mt_MT -mt_MT -Maltese (Malta) -ISO-8859-3 - -OS Locale: mt_MT.utf8 -mt_MT -Maltese (Malta) -UTF-8 - -OS Locale: nb_NO -nb_NO -Norwegian Bokmål (Norway) -ISO-8859-1 - -OS Locale: nb_NO.utf8 -nb_NO -Norwegian BokmÃ¥l (Norway) -UTF-8 - -OS Locale: ne_NP -ne_NP -Nepali (Nepal) -UTF-8 - -OS Locale: nl_BE -nl_BE -Dutch (Belgium) -ISO-8859-1 - -OS Locale: nl_BE.utf8 -nl_BE -Dutch (Belgium) -UTF-8 - -OS Locale: nl_BE@euro -nl_BE -Dutch (Belgium) -ISO-8859-15 - -OS Locale: nl_NL -nl_NL -Dutch (Netherlands) -ISO-8859-1 - -OS Locale: nl_NL.utf8 -nl_NL -Dutch (Netherlands) -UTF-8 - -OS Locale: nl_NL@euro -nl_NL -Dutch (Netherlands) -ISO-8859-15 - -OS Locale: nn_NO -nn_NO -Norwegian Nynorsk (Norway) -ISO-8859-1 - -OS Locale: nn_NO.utf8 -nn_NO -Norwegian Nynorsk (Norway) -UTF-8 - -OS Locale: no_NO -no_NO -Norwegian (Norway) -ISO-8859-1 - -OS Locale: no_NO.utf8 -no_NO -Norwegian (Norway) -UTF-8 - -OS Locale: oc_FR -oc_FR -Occitan (France) -ISO-8859-1 - -OS Locale: om_ET -om_ET -Oromo (Ethiopia) -UTF-8 - -OS Locale: om_KE -om_KE -Oromo (Kenya) -ISO-8859-1 - -OS Locale: pa_IN -pa_IN -Panjabi (India) -UTF-8 - -OS Locale: pl_PL -pl_PL -Polish (Poland) -ISO-8859-2 - -OS Locale: pl_PL.utf8 -pl_PL -Polish (Poland) -UTF-8 - -OS Locale: pt_BR -pt_BR -Portuguese (Brazil) -ISO-8859-1 - -OS Locale: pt_BR.utf8 -pt_BR -Portuguese (Brazil) -UTF-8 - -OS Locale: pt_PT -pt_PT -Portuguese (Portugal) -ISO-8859-1 - -OS Locale: pt_PT.utf8 -pt_PT -Portuguese (Portugal) -UTF-8 - -OS Locale: pt_PT@euro -pt_PT -Portuguese (Portugal) -ISO-8859-15 - -OS Locale: ro_RO -ro_RO -Romanian (Romania) -ISO-8859-2 - -OS Locale: ro_RO.utf8 -ro_RO -Romanian (Romania) -UTF-8 - -OS Locale: ru_RU -ru_RU -Russian (Russia) -ISO-8859-5 - -OS Locale: ru_RU.koi8r -ru_RU -Russian (Russia) -KOI8-R - -OS Locale: ru_RU.utf8 -ru_RU -Russian (Russia) -UTF-8 - -OS Locale: ru_UA -ru_UA -Russian (Ukraine) -KOI8-U - -OS Locale: ru_UA.utf8 -ru_UA -Russian (Ukraine) -UTF-8 - -OS Locale: se_NO -se_NO -Northern Sami (Norway) -UTF-8 - -OS Locale: sid_ET -en_ET -English (Ethiopia) -UTF-8 - -OS Locale: sk_SK -sk_SK -Slovak (Slovakia) -ISO-8859-2 - -OS Locale: sk_SK.utf8 -sk_SK -Slovak (Slovakia) -UTF-8 - -OS Locale: sl_SI -sl_SI -Slovenian (Slovenia) -ISO-8859-2 - -OS Locale: sl_SI.utf8 -sl_SI -Slovenian (Slovenia) -UTF-8 - -OS Locale: so_DJ -so_DJ -Somali (Djibouti) -ISO-8859-1 - -OS Locale: so_ET -so_ET -Somali (Ethiopia) -UTF-8 - -OS Locale: so_KE -so_KE -Somali (Kenya) -ISO-8859-1 - -OS Locale: so_SO -so_SO -Somali (Somalia) -ISO-8859-1 - -OS Locale: sq_AL -sq_AL -Albanian (Albania) -ISO-8859-1 - -OS Locale: sq_AL.utf8 -sq_AL -Albanian (Albania) -UTF-8 - -OS Locale: st_ZA -st_ZA -Southern Sotho (South Africa) -ISO-8859-1 - -OS Locale: st_ZA.utf8 -st_ZA -Southern Sotho (South Africa) -UTF-8 - -OS Locale: sv_FI -sv_FI -Swedish (Finland) -ISO-8859-1 - -OS Locale: sv_FI.utf8 -sv_FI -Swedish (Finland) -UTF-8 - -OS Locale: sv_FI@euro -sv_FI -Swedish (Finland) -ISO-8859-15 - -OS Locale: sv_SE -sv_SE -Swedish (Sweden) -ISO-8859-1 - -OS Locale: sv_SE.iso885915 -sv_SE -Swedish (Sweden) -ISO-8859-15 - -OS Locale: sv_SE.utf8 -sv_SE -Swedish (Sweden) -UTF-8 - -OS Locale: ta_IN -ta_IN -Tamil (India) -UTF-8 - -OS Locale: te_IN -te_IN -Telugu (India) -UTF-8 - -OS Locale: tg_TJ -tg_TJ -Tajik (Tajikistan) -UTF-8 - -OS Locale: th_TH -th_TH -Thai (Thailand) -TIS-620 - -OS Locale: th_TH.utf8 -th_TH -Thai (Thailand) -UTF-8 - -OS Locale: ti_ER -ti_ER -Tigrinya (Eritrea) -UTF-8 - -OS Locale: ti_ET -ti_ET -Tigrinya (Ethiopia) -UTF-8 - -OS Locale: tig_ER -en_ER -English (Eritrea) -UTF-8 - -OS Locale: tl_PH -tl_PH -Tagalog (Philippines) -ISO-8859-1 - -OS Locale: tr_TR -tr_TR -Turkish (Turkey) -ISO-8859-9 - -OS Locale: tr_TR.utf8 -tr_TR -Turkish (Turkey) -UTF-8 - -OS Locale: tt_RU.utf8 -tt_RU -Tatar (Russia) -UTF-8 - -OS Locale: uk_UA -uk_UA -Ukrainian (Ukraine) -KOI8-U - -OS Locale: uk_UA.utf8 -uk_UA -Ukrainian (Ukraine) -UTF-8 - -OS Locale: ur_PK -ur_PK -Urdu (Pakistan) -UTF-8 - -OS Locale: uz_UZ -uz_UZ -Uzbek (Uzbekistan) -ISO-8859-1 - -OS Locale: uz_UZ@cyrillic -uz_UZ -Uzbek (Uzbekistan) -UTF-8 - -OS Locale: vi_VN -vi_VN -Vietnamese (Vietnam) -UTF-8 - -OS Locale: vi_VN.tcvn -vi_VN -Vietnamese (Vietnam) -UTF-8 - -OS Locale: wa_BE -wa_BE -Walloon (Belgium) -ISO-8859-1 - -OS Locale: wa_BE.utf8 -wa_BE -Walloon (Belgium) -UTF-8 - -OS Locale: wa_BE@euro -wa_BE -Walloon (Belgium) -ISO-8859-15 - -OS Locale: xh_ZA -xh_ZA -Xhosa (South Africa) -ISO-8859-1 - -OS Locale: xh_ZA.utf8 -xh_ZA -Xhosa (South Africa) -UTF-8 - -OS Locale: yi_US -ji_US -Yiddish (United States) -windows-1255 - -OS Locale: zh_CN -zh_CN -Chinese (China) -GB2312 - -OS Locale: zh_CN.gb18030 -zh_CN -Chinese (China) -GB18030 - -OS Locale: zh_CN.gbk -zh_CN -Chinese (China) -GBK - -OS Locale: zh_CN.utf8 -zh_CN -Chinese (China) -UTF-8 - -OS Locale: zh_HK -zh_HK -Chinese (Hong Kong) -Big5-HKSCS - -OS Locale: zh_HK.utf8 -zh_HK -Chinese (Hong Kong) -UTF-8 - -OS Locale: zh_SG -zh_SG -Chinese (Singapore) -GB2312 - -OS Locale: zh_SG.gbk -zh_SG -Chinese (Singapore) -GBK - -OS Locale: zh_TW -zh_TW -Chinese (Taiwan) -Big5 - -OS Locale: zh_TW.euctw -zh_TW -Chinese (Taiwan) -x-EUC-TW - -OS Locale: zh_TW.utf8 -zh_TW -Chinese (Taiwan) -UTF-8 - -OS Locale: zu_ZA -zu_ZA -Zulu (South Africa) -ISO-8859-1 - -OS Locale: zu_ZA.utf8 -zu_ZA -Zulu (South Africa) -UTF-8 diff --git a/jdk/test/java/util/Locale/data/deflocale.rhel5 b/jdk/test/java/util/Locale/data/deflocale.rhel5 new file mode 100644 index 00000000000..5d534f9bb6b --- /dev/null +++ b/jdk/test/java/util/Locale/data/deflocale.rhel5 @@ -0,0 +1,3924 @@ +Red Hat Enterprise Linux Server release 5.3 (Tikanga) +Linux localhost.localdomain 2.6.18-128.el5 #1 SMP Wed Dec 17 11:42:39 EST 2008 i686 i686 i386 GNU/Linux +Testing all available locales + +OS Locale: C +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: US-ASCII + +OS Locale: POSIX +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: US-ASCII + +OS Locale: aa_DJ +default locale: ID: aa_DJ, Name: Afar (Djibouti) +display locale: ID: aa_DJ, Name: Afar (Djibouti) +format locale: ID: aa_DJ, Name: Afar (Djibouti) +default charset: ISO-8859-1 + +OS Locale: aa_DJ.iso88591 +default locale: ID: aa_DJ, Name: Afar (Djibouti) +display locale: ID: aa_DJ, Name: Afar (Djibouti) +format locale: ID: aa_DJ, Name: Afar (Djibouti) +default charset: ISO-8859-1 + +OS Locale: aa_DJ.utf8 +default locale: ID: aa_DJ, Name: Afar (Djibouti) +display locale: ID: aa_DJ, Name: Afar (Djibouti) +format locale: ID: aa_DJ, Name: Afar (Djibouti) +default charset: UTF-8 + +OS Locale: aa_ER +default locale: ID: aa_ER, Name: Afar (Eritrea) +display locale: ID: aa_ER, Name: Afar (Eritrea) +format locale: ID: aa_ER, Name: Afar (Eritrea) +default charset: UTF-8 + +OS Locale: aa_ER.utf8 +default locale: ID: aa_ER, Name: Afar (Eritrea) +display locale: ID: aa_ER, Name: Afar (Eritrea) +format locale: ID: aa_ER, Name: Afar (Eritrea) +default charset: UTF-8 + +OS Locale: aa_ER.utf8@saaho +default locale: ID: aa_ER, Name: Afar (Eritrea) +display locale: ID: aa_ER, Name: Afar (Eritrea) +format locale: ID: aa_ER, Name: Afar (Eritrea) +default charset: UTF-8 + +OS Locale: aa_ER@saaho +default locale: ID: aa_ER, Name: Afar (Eritrea) +display locale: ID: aa_ER, Name: Afar (Eritrea) +format locale: ID: aa_ER, Name: Afar (Eritrea) +default charset: UTF-8 + +OS Locale: aa_ET +default locale: ID: aa_ET, Name: Afar (Ethiopia) +display locale: ID: aa_ET, Name: Afar (Ethiopia) +format locale: ID: aa_ET, Name: Afar (Ethiopia) +default charset: UTF-8 + +OS Locale: aa_ET.utf8 +default locale: ID: aa_ET, Name: Afar (Ethiopia) +display locale: ID: aa_ET, Name: Afar (Ethiopia) +format locale: ID: aa_ET, Name: Afar (Ethiopia) +default charset: UTF-8 + +OS Locale: af_ZA +default locale: ID: af_ZA, Name: Afrikaans (South Africa) +display locale: ID: af_ZA, Name: Afrikaans (South Africa) +format locale: ID: af_ZA, Name: Afrikaans (South Africa) +default charset: ISO-8859-1 + +OS Locale: af_ZA.iso88591 +default locale: ID: af_ZA, Name: Afrikaans (South Africa) +display locale: ID: af_ZA, Name: Afrikaans (South Africa) +format locale: ID: af_ZA, Name: Afrikaans (South Africa) +default charset: ISO-8859-1 + +OS Locale: af_ZA.utf8 +default locale: ID: af_ZA, Name: Afrikaans (South Africa) +display locale: ID: af_ZA, Name: Afrikaans (South Africa) +format locale: ID: af_ZA, Name: Afrikaans (South Africa) +default charset: UTF-8 + +OS Locale: am_ET +default locale: ID: am_ET, Name: Amharic (Ethiopia) +display locale: ID: am_ET, Name: Amharic (Ethiopia) +format locale: ID: am_ET, Name: Amharic (Ethiopia) +default charset: UTF-8 + +OS Locale: am_ET.utf8 +default locale: ID: am_ET, Name: Amharic (Ethiopia) +display locale: ID: am_ET, Name: Amharic (Ethiopia) +format locale: ID: am_ET, Name: Amharic (Ethiopia) +default charset: UTF-8 + +OS Locale: an_ES +default locale: ID: an_ES, Name: Aragonese (Spain) +display locale: ID: an_ES, Name: Aragonese (Spain) +format locale: ID: an_ES, Name: Aragonese (Spain) +default charset: ISO-8859-15 + +OS Locale: an_ES.iso885915 +default locale: ID: an_ES, Name: Aragonese (Spain) +display locale: ID: an_ES, Name: Aragonese (Spain) +format locale: ID: an_ES, Name: Aragonese (Spain) +default charset: ISO-8859-15 + +OS Locale: an_ES.utf8 +default locale: ID: an_ES, Name: Aragonese (Spain) +display locale: ID: an_ES, Name: Aragonese (Spain) +format locale: ID: an_ES, Name: Aragonese (Spain) +default charset: UTF-8 + +OS Locale: ar_AE +default locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +display locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +format locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +default charset: ISO-8859-6 + +OS Locale: ar_AE.iso88596 +default locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +display locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +format locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +default charset: ISO-8859-6 + +OS Locale: ar_AE.utf8 +default locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +display locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +format locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +default charset: UTF-8 + +OS Locale: ar_BH +default locale: ID: ar_BH, Name: Arabic (Bahrain) +display locale: ID: ar_BH, Name: Arabic (Bahrain) +format locale: ID: ar_BH, Name: Arabic (Bahrain) +default charset: ISO-8859-6 + +OS Locale: ar_BH.iso88596 +default locale: ID: ar_BH, Name: Arabic (Bahrain) +display locale: ID: ar_BH, Name: Arabic (Bahrain) +format locale: ID: ar_BH, Name: Arabic (Bahrain) +default charset: ISO-8859-6 + +OS Locale: ar_BH.utf8 +default locale: ID: ar_BH, Name: Arabic (Bahrain) +display locale: ID: ar_BH, Name: Arabic (Bahrain) +format locale: ID: ar_BH, Name: Arabic (Bahrain) +default charset: UTF-8 + +OS Locale: ar_DZ +default locale: ID: ar_DZ, Name: Arabic (Algeria) +display locale: ID: ar_DZ, Name: Arabic (Algeria) +format locale: ID: ar_DZ, Name: Arabic (Algeria) +default charset: ISO-8859-6 + +OS Locale: ar_DZ.iso88596 +default locale: ID: ar_DZ, Name: Arabic (Algeria) +display locale: ID: ar_DZ, Name: Arabic (Algeria) +format locale: ID: ar_DZ, Name: Arabic (Algeria) +default charset: ISO-8859-6 + +OS Locale: ar_DZ.utf8 +default locale: ID: ar_DZ, Name: Arabic (Algeria) +display locale: ID: ar_DZ, Name: Arabic (Algeria) +format locale: ID: ar_DZ, Name: Arabic (Algeria) +default charset: UTF-8 + +OS Locale: ar_EG +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: ISO-8859-6 + +OS Locale: ar_EG.iso88596 +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: ISO-8859-6 + +OS Locale: ar_EG.utf8 +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: UTF-8 + +OS Locale: ar_IN +default locale: ID: ar_IN, Name: Arabic (India) +display locale: ID: ar_IN, Name: Arabic (India) +format locale: ID: ar_IN, Name: Arabic (India) +default charset: UTF-8 + +OS Locale: ar_IN.utf8 +default locale: ID: ar_IN, Name: Arabic (India) +display locale: ID: ar_IN, Name: Arabic (India) +format locale: ID: ar_IN, Name: Arabic (India) +default charset: UTF-8 + +OS Locale: ar_IQ +default locale: ID: ar_IQ, Name: Arabic (Iraq) +display locale: ID: ar_IQ, Name: Arabic (Iraq) +format locale: ID: ar_IQ, Name: Arabic (Iraq) +default charset: ISO-8859-6 + +OS Locale: ar_IQ.iso88596 +default locale: ID: ar_IQ, Name: Arabic (Iraq) +display locale: ID: ar_IQ, Name: Arabic (Iraq) +format locale: ID: ar_IQ, Name: Arabic (Iraq) +default charset: ISO-8859-6 + +OS Locale: ar_IQ.utf8 +default locale: ID: ar_IQ, Name: Arabic (Iraq) +display locale: ID: ar_IQ, Name: Arabic (Iraq) +format locale: ID: ar_IQ, Name: Arabic (Iraq) +default charset: UTF-8 + +OS Locale: ar_JO +default locale: ID: ar_JO, Name: Arabic (Jordan) +display locale: ID: ar_JO, Name: Arabic (Jordan) +format locale: ID: ar_JO, Name: Arabic (Jordan) +default charset: ISO-8859-6 + +OS Locale: ar_JO.iso88596 +default locale: ID: ar_JO, Name: Arabic (Jordan) +display locale: ID: ar_JO, Name: Arabic (Jordan) +format locale: ID: ar_JO, Name: Arabic (Jordan) +default charset: ISO-8859-6 + +OS Locale: ar_JO.utf8 +default locale: ID: ar_JO, Name: Arabic (Jordan) +display locale: ID: ar_JO, Name: Arabic (Jordan) +format locale: ID: ar_JO, Name: Arabic (Jordan) +default charset: UTF-8 + +OS Locale: ar_KW +default locale: ID: ar_KW, Name: Arabic (Kuwait) +display locale: ID: ar_KW, Name: Arabic (Kuwait) +format locale: ID: ar_KW, Name: Arabic (Kuwait) +default charset: ISO-8859-6 + +OS Locale: ar_KW.iso88596 +default locale: ID: ar_KW, Name: Arabic (Kuwait) +display locale: ID: ar_KW, Name: Arabic (Kuwait) +format locale: ID: ar_KW, Name: Arabic (Kuwait) +default charset: ISO-8859-6 + +OS Locale: ar_KW.utf8 +default locale: ID: ar_KW, Name: Arabic (Kuwait) +display locale: ID: ar_KW, Name: Arabic (Kuwait) +format locale: ID: ar_KW, Name: Arabic (Kuwait) +default charset: UTF-8 + +OS Locale: ar_LB +default locale: ID: ar_LB, Name: Arabic (Lebanon) +display locale: ID: ar_LB, Name: Arabic (Lebanon) +format locale: ID: ar_LB, Name: Arabic (Lebanon) +default charset: ISO-8859-6 + +OS Locale: ar_LB.iso88596 +default locale: ID: ar_LB, Name: Arabic (Lebanon) +display locale: ID: ar_LB, Name: Arabic (Lebanon) +format locale: ID: ar_LB, Name: Arabic (Lebanon) +default charset: ISO-8859-6 + +OS Locale: ar_LB.utf8 +default locale: ID: ar_LB, Name: Arabic (Lebanon) +display locale: ID: ar_LB, Name: Arabic (Lebanon) +format locale: ID: ar_LB, Name: Arabic (Lebanon) +default charset: UTF-8 + +OS Locale: ar_LY +default locale: ID: ar_LY, Name: Arabic (Libya) +display locale: ID: ar_LY, Name: Arabic (Libya) +format locale: ID: ar_LY, Name: Arabic (Libya) +default charset: ISO-8859-6 + +OS Locale: ar_LY.iso88596 +default locale: ID: ar_LY, Name: Arabic (Libya) +display locale: ID: ar_LY, Name: Arabic (Libya) +format locale: ID: ar_LY, Name: Arabic (Libya) +default charset: ISO-8859-6 + +OS Locale: ar_LY.utf8 +default locale: ID: ar_LY, Name: Arabic (Libya) +display locale: ID: ar_LY, Name: Arabic (Libya) +format locale: ID: ar_LY, Name: Arabic (Libya) +default charset: UTF-8 + +OS Locale: ar_MA +default locale: ID: ar_MA, Name: Arabic (Morocco) +display locale: ID: ar_MA, Name: Arabic (Morocco) +format locale: ID: ar_MA, Name: Arabic (Morocco) +default charset: ISO-8859-6 + +OS Locale: ar_MA.iso88596 +default locale: ID: ar_MA, Name: Arabic (Morocco) +display locale: ID: ar_MA, Name: Arabic (Morocco) +format locale: ID: ar_MA, Name: Arabic (Morocco) +default charset: ISO-8859-6 + +OS Locale: ar_MA.utf8 +default locale: ID: ar_MA, Name: Arabic (Morocco) +display locale: ID: ar_MA, Name: Arabic (Morocco) +format locale: ID: ar_MA, Name: Arabic (Morocco) +default charset: UTF-8 + +OS Locale: ar_OM +default locale: ID: ar_OM, Name: Arabic (Oman) +display locale: ID: ar_OM, Name: Arabic (Oman) +format locale: ID: ar_OM, Name: Arabic (Oman) +default charset: ISO-8859-6 + +OS Locale: ar_OM.iso88596 +default locale: ID: ar_OM, Name: Arabic (Oman) +display locale: ID: ar_OM, Name: Arabic (Oman) +format locale: ID: ar_OM, Name: Arabic (Oman) +default charset: ISO-8859-6 + +OS Locale: ar_OM.utf8 +default locale: ID: ar_OM, Name: Arabic (Oman) +display locale: ID: ar_OM, Name: Arabic (Oman) +format locale: ID: ar_OM, Name: Arabic (Oman) +default charset: UTF-8 + +OS Locale: ar_QA +default locale: ID: ar_QA, Name: Arabic (Qatar) +display locale: ID: ar_QA, Name: Arabic (Qatar) +format locale: ID: ar_QA, Name: Arabic (Qatar) +default charset: ISO-8859-6 + +OS Locale: ar_QA.iso88596 +default locale: ID: ar_QA, Name: Arabic (Qatar) +display locale: ID: ar_QA, Name: Arabic (Qatar) +format locale: ID: ar_QA, Name: Arabic (Qatar) +default charset: ISO-8859-6 + +OS Locale: ar_QA.utf8 +default locale: ID: ar_QA, Name: Arabic (Qatar) +display locale: ID: ar_QA, Name: Arabic (Qatar) +format locale: ID: ar_QA, Name: Arabic (Qatar) +default charset: UTF-8 + +OS Locale: ar_SA +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: ISO-8859-6 + +OS Locale: ar_SA.iso88596 +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: ISO-8859-6 + +OS Locale: ar_SA.utf8 +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: UTF-8 + +OS Locale: ar_SD +default locale: ID: ar_SD, Name: Arabic (Sudan) +display locale: ID: ar_SD, Name: Arabic (Sudan) +format locale: ID: ar_SD, Name: Arabic (Sudan) +default charset: ISO-8859-6 + +OS Locale: ar_SD.iso88596 +default locale: ID: ar_SD, Name: Arabic (Sudan) +display locale: ID: ar_SD, Name: Arabic (Sudan) +format locale: ID: ar_SD, Name: Arabic (Sudan) +default charset: ISO-8859-6 + +OS Locale: ar_SD.utf8 +default locale: ID: ar_SD, Name: Arabic (Sudan) +display locale: ID: ar_SD, Name: Arabic (Sudan) +format locale: ID: ar_SD, Name: Arabic (Sudan) +default charset: UTF-8 + +OS Locale: ar_SY +default locale: ID: ar_SY, Name: Arabic (Syria) +display locale: ID: ar_SY, Name: Arabic (Syria) +format locale: ID: ar_SY, Name: Arabic (Syria) +default charset: ISO-8859-6 + +OS Locale: ar_SY.iso88596 +default locale: ID: ar_SY, Name: Arabic (Syria) +display locale: ID: ar_SY, Name: Arabic (Syria) +format locale: ID: ar_SY, Name: Arabic (Syria) +default charset: ISO-8859-6 + +OS Locale: ar_SY.utf8 +default locale: ID: ar_SY, Name: Arabic (Syria) +display locale: ID: ar_SY, Name: Arabic (Syria) +format locale: ID: ar_SY, Name: Arabic (Syria) +default charset: UTF-8 + +OS Locale: ar_TN +default locale: ID: ar_TN, Name: Arabic (Tunisia) +display locale: ID: ar_TN, Name: Arabic (Tunisia) +format locale: ID: ar_TN, Name: Arabic (Tunisia) +default charset: ISO-8859-6 + +OS Locale: ar_TN.iso88596 +default locale: ID: ar_TN, Name: Arabic (Tunisia) +display locale: ID: ar_TN, Name: Arabic (Tunisia) +format locale: ID: ar_TN, Name: Arabic (Tunisia) +default charset: ISO-8859-6 + +OS Locale: ar_TN.utf8 +default locale: ID: ar_TN, Name: Arabic (Tunisia) +display locale: ID: ar_TN, Name: Arabic (Tunisia) +format locale: ID: ar_TN, Name: Arabic (Tunisia) +default charset: UTF-8 + +OS Locale: ar_YE +default locale: ID: ar_YE, Name: Arabic (Yemen) +display locale: ID: ar_YE, Name: Arabic (Yemen) +format locale: ID: ar_YE, Name: Arabic (Yemen) +default charset: ISO-8859-6 + +OS Locale: ar_YE.iso88596 +default locale: ID: ar_YE, Name: Arabic (Yemen) +display locale: ID: ar_YE, Name: Arabic (Yemen) +format locale: ID: ar_YE, Name: Arabic (Yemen) +default charset: ISO-8859-6 + +OS Locale: ar_YE.utf8 +default locale: ID: ar_YE, Name: Arabic (Yemen) +display locale: ID: ar_YE, Name: Arabic (Yemen) +format locale: ID: ar_YE, Name: Arabic (Yemen) +default charset: UTF-8 + +OS Locale: as_IN.utf8 +default locale: ID: as_IN, Name: Assamese (India) +display locale: ID: as_IN, Name: Assamese (India) +format locale: ID: as_IN, Name: Assamese (India) +default charset: UTF-8 + +OS Locale: az_AZ.utf8 +default locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +display locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: UTF-8 + +OS Locale: be_BY +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: windows-1251 + +OS Locale: be_BY.cp1251 +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: windows-1251 + +OS Locale: be_BY.utf8 +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: UTF-8 + +OS Locale: be_BY.utf8@latin +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: UTF-8 + +OS Locale: be_BY@latin +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: UTF-8 + +OS Locale: bg_BG +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: windows-1251 + +OS Locale: bg_BG.cp1251 +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: windows-1251 + +OS Locale: bg_BG.utf8 +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: UTF-8 + +OS Locale: bn_BD +default locale: ID: bn_BD, Name: Bengali (Bangladesh) +display locale: ID: bn_BD, Name: Bengali (Bangladesh) +format locale: ID: bn_BD, Name: Bengali (Bangladesh) +default charset: UTF-8 + +OS Locale: bn_BD.utf8 +default locale: ID: bn_BD, Name: Bengali (Bangladesh) +display locale: ID: bn_BD, Name: Bengali (Bangladesh) +format locale: ID: bn_BD, Name: Bengali (Bangladesh) +default charset: UTF-8 + +OS Locale: bn_IN +default locale: ID: bn_IN, Name: Bengali (India) +display locale: ID: bn_IN, Name: Bengali (India) +format locale: ID: bn_IN, Name: Bengali (India) +default charset: UTF-8 + +OS Locale: bn_IN.utf8 +default locale: ID: bn_IN, Name: Bengali (India) +display locale: ID: bn_IN, Name: Bengali (India) +format locale: ID: bn_IN, Name: Bengali (India) +default charset: UTF-8 + +OS Locale: bokmål +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: bokmal +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: br_FR +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: ISO-8859-1 + +OS Locale: br_FR.iso88591 +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: ISO-8859-1 + +OS Locale: br_FR.iso885915@euro +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: ISO-8859-15 + +OS Locale: br_FR.utf8 +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: UTF-8 + +OS Locale: br_FR@euro +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: ISO-8859-15 + +OS Locale: bs_BA +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: ISO-8859-2 + +OS Locale: bs_BA.iso88592 +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: ISO-8859-2 + +OS Locale: bs_BA.utf8 +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: UTF-8 + +OS Locale: byn_ER +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: byn_ER.utf8 +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: ca_AD +default locale: ID: ca_AD, Name: Catalan (Andorra) +display locale: ID: ca_AD, Name: Catalan (Andorra) +format locale: ID: ca_AD, Name: Catalan (Andorra) +default charset: ISO-8859-15 + +OS Locale: ca_AD.iso885915 +default locale: ID: ca_AD, Name: Catalan (Andorra) +display locale: ID: ca_AD, Name: Catalan (Andorra) +format locale: ID: ca_AD, Name: Catalan (Andorra) +default charset: ISO-8859-15 + +OS Locale: ca_AD.utf8 +default locale: ID: ca_AD, Name: Catalan (Andorra) +display locale: ID: ca_AD, Name: Catalan (Andorra) +format locale: ID: ca_AD, Name: Catalan (Andorra) +default charset: UTF-8 + +OS Locale: ca_ES +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: ca_ES.iso88591 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: ca_ES.iso885915@euro +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-15 + +OS Locale: ca_ES.utf8 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: UTF-8 + +OS Locale: ca_ES@euro +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-15 + +OS Locale: ca_FR +default locale: ID: ca_FR, Name: Catalan (France) +display locale: ID: ca_FR, Name: Catalan (France) +format locale: ID: ca_FR, Name: Catalan (France) +default charset: ISO-8859-15 + +OS Locale: ca_FR.iso885915 +default locale: ID: ca_FR, Name: Catalan (France) +display locale: ID: ca_FR, Name: Catalan (France) +format locale: ID: ca_FR, Name: Catalan (France) +default charset: ISO-8859-15 + +OS Locale: ca_FR.utf8 +default locale: ID: ca_FR, Name: Catalan (France) +display locale: ID: ca_FR, Name: Catalan (France) +format locale: ID: ca_FR, Name: Catalan (France) +default charset: UTF-8 + +OS Locale: ca_IT +default locale: ID: ca_IT, Name: Catalan (Italy) +display locale: ID: ca_IT, Name: Catalan (Italy) +format locale: ID: ca_IT, Name: Catalan (Italy) +default charset: ISO-8859-15 + +OS Locale: ca_IT.iso885915 +default locale: ID: ca_IT, Name: Catalan (Italy) +display locale: ID: ca_IT, Name: Catalan (Italy) +format locale: ID: ca_IT, Name: Catalan (Italy) +default charset: ISO-8859-15 + +OS Locale: ca_IT.utf8 +default locale: ID: ca_IT, Name: Catalan (Italy) +display locale: ID: ca_IT, Name: Catalan (Italy) +format locale: ID: ca_IT, Name: Catalan (Italy) +default charset: UTF-8 + +OS Locale: catalan +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: croatian +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: cs_CZ +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: cs_CZ.iso88592 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: cs_CZ.utf8 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: UTF-8 + +OS Locale: csb_PL +default locale: ID: en_PL, Name: English (Poland) +display locale: ID: en_PL, Name: English (Poland) +format locale: ID: en_PL, Name: English (Poland) +default charset: UTF-8 + +OS Locale: csb_PL.utf8 +default locale: ID: en_PL, Name: English (Poland) +display locale: ID: en_PL, Name: English (Poland) +format locale: ID: en_PL, Name: English (Poland) +default charset: UTF-8 + +OS Locale: cy_GB +default locale: ID: cy_GB, Name: Welsh (United Kingdom) +display locale: ID: cy_GB, Name: Welsh (United Kingdom) +format locale: ID: cy_GB, Name: Welsh (United Kingdom) +default charset: UTF-8 + +OS Locale: cy_GB.iso885914 +default locale: ID: cy_GB, Name: Welsh (United Kingdom) +display locale: ID: cy_GB, Name: Welsh (United Kingdom) +format locale: ID: cy_GB, Name: Welsh (United Kingdom) +default charset: UTF-8 + +OS Locale: cy_GB.utf8 +default locale: ID: cy_GB, Name: Welsh (United Kingdom) +display locale: ID: cy_GB, Name: Welsh (United Kingdom) +format locale: ID: cy_GB, Name: Welsh (United Kingdom) +default charset: UTF-8 + +OS Locale: czech +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: da_DK +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: da_DK.iso88591 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: da_DK.iso885915 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-15 + +OS Locale: da_DK.utf8 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: UTF-8 + +OS Locale: danish +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: dansk +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: de_AT +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-1 + +OS Locale: de_AT.iso88591 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-1 + +OS Locale: de_AT.iso885915@euro +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-15 + +OS Locale: de_AT.utf8 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: UTF-8 + +OS Locale: de_AT@euro +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-15 + +OS Locale: de_BE +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: ISO-8859-1 + +OS Locale: de_BE.iso88591 +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: ISO-8859-1 + +OS Locale: de_BE.iso885915@euro +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: ISO-8859-15 + +OS Locale: de_BE.utf8 +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: UTF-8 + +OS Locale: de_BE@euro +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: ISO-8859-15 + +OS Locale: de_CH +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: ISO-8859-1 + +OS Locale: de_CH.iso88591 +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: ISO-8859-1 + +OS Locale: de_CH.utf8 +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: UTF-8 + +OS Locale: de_DE +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: de_DE.iso88591 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: de_DE.iso885915@euro +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 + +OS Locale: de_DE.utf8 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: UTF-8 + +OS Locale: de_DE@euro +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 + +OS Locale: de_LU +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: ISO-8859-1 + +OS Locale: de_LU.iso88591 +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: ISO-8859-1 + +OS Locale: de_LU.iso885915@euro +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: ISO-8859-15 + +OS Locale: de_LU.utf8 +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: UTF-8 + +OS Locale: de_LU@euro +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: ISO-8859-15 + +OS Locale: deutsch +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: dutch +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: dz_BT +default locale: ID: dz_BT, Name: Dzongkha (Bhutan) +display locale: ID: dz_BT, Name: Dzongkha (Bhutan) +format locale: ID: dz_BT, Name: Dzongkha (Bhutan) +default charset: UTF-8 + +OS Locale: dz_BT.utf8 +default locale: ID: dz_BT, Name: Dzongkha (Bhutan) +display locale: ID: dz_BT, Name: Dzongkha (Bhutan) +format locale: ID: dz_BT, Name: Dzongkha (Bhutan) +default charset: UTF-8 + +OS Locale: eesti +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: el_CY +default locale: ID: el_CY, Name: Greek (Cyprus) +display locale: ID: el_CY, Name: Greek (Cyprus) +format locale: ID: el_CY, Name: Greek (Cyprus) +default charset: ISO-8859-7 + +OS Locale: el_CY.iso88597 +default locale: ID: el_CY, Name: Greek (Cyprus) +display locale: ID: el_CY, Name: Greek (Cyprus) +format locale: ID: el_CY, Name: Greek (Cyprus) +default charset: ISO-8859-7 + +OS Locale: el_CY.utf8 +default locale: ID: el_CY, Name: Greek (Cyprus) +display locale: ID: el_CY, Name: Greek (Cyprus) +format locale: ID: el_CY, Name: Greek (Cyprus) +default charset: UTF-8 + +OS Locale: el_GR +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: el_GR.iso88597 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: el_GR.utf8 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: UTF-8 + +OS Locale: en_AU +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: ISO-8859-1 + +OS Locale: en_AU.iso88591 +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: ISO-8859-1 + +OS Locale: en_AU.utf8 +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: UTF-8 + +OS Locale: en_BW +default locale: ID: en_BW, Name: English (Botswana) +display locale: ID: en_BW, Name: English (Botswana) +format locale: ID: en_BW, Name: English (Botswana) +default charset: ISO-8859-1 + +OS Locale: en_BW.iso88591 +default locale: ID: en_BW, Name: English (Botswana) +display locale: ID: en_BW, Name: English (Botswana) +format locale: ID: en_BW, Name: English (Botswana) +default charset: ISO-8859-1 + +OS Locale: en_BW.utf8 +default locale: ID: en_BW, Name: English (Botswana) +display locale: ID: en_BW, Name: English (Botswana) +format locale: ID: en_BW, Name: English (Botswana) +default charset: UTF-8 + +OS Locale: en_CA +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: ISO-8859-1 + +OS Locale: en_CA.iso88591 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: ISO-8859-1 + +OS Locale: en_CA.utf8 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: UTF-8 + +OS Locale: en_DK +default locale: ID: en_DK, Name: English (Denmark) +display locale: ID: en_DK, Name: English (Denmark) +format locale: ID: en_DK, Name: English (Denmark) +default charset: ISO-8859-1 + +OS Locale: en_DK.iso88591 +default locale: ID: en_DK, Name: English (Denmark) +display locale: ID: en_DK, Name: English (Denmark) +format locale: ID: en_DK, Name: English (Denmark) +default charset: ISO-8859-1 + +OS Locale: en_DK.utf8 +default locale: ID: en_DK, Name: English (Denmark) +display locale: ID: en_DK, Name: English (Denmark) +format locale: ID: en_DK, Name: English (Denmark) +default charset: UTF-8 + +OS Locale: en_GB +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: en_GB.iso88591 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: en_GB.iso885915 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-15 + +OS Locale: en_GB.utf8 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: UTF-8 + +OS Locale: en_HK +default locale: ID: en_HK, Name: English (Hong Kong) +display locale: ID: en_HK, Name: English (Hong Kong) +format locale: ID: en_HK, Name: English (Hong Kong) +default charset: ISO-8859-1 + +OS Locale: en_HK.iso88591 +default locale: ID: en_HK, Name: English (Hong Kong) +display locale: ID: en_HK, Name: English (Hong Kong) +format locale: ID: en_HK, Name: English (Hong Kong) +default charset: ISO-8859-1 + +OS Locale: en_HK.utf8 +default locale: ID: en_HK, Name: English (Hong Kong) +display locale: ID: en_HK, Name: English (Hong Kong) +format locale: ID: en_HK, Name: English (Hong Kong) +default charset: UTF-8 + +OS Locale: en_IE +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-1 + +OS Locale: en_IE.iso88591 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-1 + +OS Locale: en_IE.iso885915@euro +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-15 + +OS Locale: en_IE.utf8 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: UTF-8 + +OS Locale: en_IE@euro +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-15 + +OS Locale: en_IN +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: UTF-8 + +OS Locale: en_IN.utf8 +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: UTF-8 + +OS Locale: en_NZ +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: ISO-8859-1 + +OS Locale: en_NZ.iso88591 +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: ISO-8859-1 + +OS Locale: en_NZ.utf8 +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: UTF-8 + +OS Locale: en_PH +default locale: ID: en_PH, Name: English (Philippines) +display locale: ID: en_PH, Name: English (Philippines) +format locale: ID: en_PH, Name: English (Philippines) +default charset: ISO-8859-1 + +OS Locale: en_PH.iso88591 +default locale: ID: en_PH, Name: English (Philippines) +display locale: ID: en_PH, Name: English (Philippines) +format locale: ID: en_PH, Name: English (Philippines) +default charset: ISO-8859-1 + +OS Locale: en_PH.utf8 +default locale: ID: en_PH, Name: English (Philippines) +display locale: ID: en_PH, Name: English (Philippines) +format locale: ID: en_PH, Name: English (Philippines) +default charset: UTF-8 + +OS Locale: en_SG +default locale: ID: en_SG, Name: English (Singapore) +display locale: ID: en_SG, Name: English (Singapore) +format locale: ID: en_SG, Name: English (Singapore) +default charset: ISO-8859-1 + +OS Locale: en_SG.iso88591 +default locale: ID: en_SG, Name: English (Singapore) +display locale: ID: en_SG, Name: English (Singapore) +format locale: ID: en_SG, Name: English (Singapore) +default charset: ISO-8859-1 + +OS Locale: en_SG.utf8 +default locale: ID: en_SG, Name: English (Singapore) +display locale: ID: en_SG, Name: English (Singapore) +format locale: ID: en_SG, Name: English (Singapore) +default charset: UTF-8 + +OS Locale: en_US +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-1 + +OS Locale: en_US.iso88591 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-1 + +OS Locale: en_US.iso885915 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-15 + +OS Locale: en_US.utf8 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: UTF-8 + +OS Locale: en_ZA +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: ISO-8859-1 + +OS Locale: en_ZA.iso88591 +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: ISO-8859-1 + +OS Locale: en_ZA.utf8 +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: UTF-8 + +OS Locale: en_ZW +default locale: ID: en_ZW, Name: English (Zimbabwe) +display locale: ID: en_ZW, Name: English (Zimbabwe) +format locale: ID: en_ZW, Name: English (Zimbabwe) +default charset: ISO-8859-1 + +OS Locale: en_ZW.iso88591 +default locale: ID: en_ZW, Name: English (Zimbabwe) +display locale: ID: en_ZW, Name: English (Zimbabwe) +format locale: ID: en_ZW, Name: English (Zimbabwe) +default charset: ISO-8859-1 + +OS Locale: en_ZW.utf8 +default locale: ID: en_ZW, Name: English (Zimbabwe) +display locale: ID: en_ZW, Name: English (Zimbabwe) +format locale: ID: en_ZW, Name: English (Zimbabwe) +default charset: UTF-8 + +OS Locale: es_AR +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: ISO-8859-1 + +OS Locale: es_AR.iso88591 +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: ISO-8859-1 + +OS Locale: es_AR.utf8 +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: UTF-8 + +OS Locale: es_BO +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: ISO-8859-1 + +OS Locale: es_BO.iso88591 +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: ISO-8859-1 + +OS Locale: es_BO.utf8 +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: UTF-8 + +OS Locale: es_CL +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: ISO-8859-1 + +OS Locale: es_CL.iso88591 +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: ISO-8859-1 + +OS Locale: es_CL.utf8 +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: UTF-8 + +OS Locale: es_CO +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: ISO-8859-1 + +OS Locale: es_CO.iso88591 +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: ISO-8859-1 + +OS Locale: es_CO.utf8 +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: UTF-8 + +OS Locale: es_CR +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: ISO-8859-1 + +OS Locale: es_CR.iso88591 +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: ISO-8859-1 + +OS Locale: es_CR.utf8 +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: UTF-8 + +OS Locale: es_DO +default locale: ID: es_DO, Name: Spanish (Dominican Republic) +display locale: ID: es_DO, Name: Spanish (Dominican Republic) +format locale: ID: es_DO, Name: Spanish (Dominican Republic) +default charset: ISO-8859-1 + +OS Locale: es_DO.iso88591 +default locale: ID: es_DO, Name: Spanish (Dominican Republic) +display locale: ID: es_DO, Name: Spanish (Dominican Republic) +format locale: ID: es_DO, Name: Spanish (Dominican Republic) +default charset: ISO-8859-1 + +OS Locale: es_DO.utf8 +default locale: ID: es_DO, Name: Spanish (Dominican Republic) +display locale: ID: es_DO, Name: Spanish (Dominican Republic) +format locale: ID: es_DO, Name: Spanish (Dominican Republic) +default charset: UTF-8 + +OS Locale: es_EC +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: ISO-8859-1 + +OS Locale: es_EC.iso88591 +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: ISO-8859-1 + +OS Locale: es_EC.utf8 +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: UTF-8 + +OS Locale: es_ES +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: es_ES.iso88591 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: es_ES.iso885915@euro +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 + +OS Locale: es_ES.utf8 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: UTF-8 + +OS Locale: es_ES@euro +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 + +OS Locale: es_GT +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: ISO-8859-1 + +OS Locale: es_GT.iso88591 +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: ISO-8859-1 + +OS Locale: es_GT.utf8 +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: UTF-8 + +OS Locale: es_HN +default locale: ID: es_HN, Name: Spanish (Honduras) +display locale: ID: es_HN, Name: Spanish (Honduras) +format locale: ID: es_HN, Name: Spanish (Honduras) +default charset: ISO-8859-1 + +OS Locale: es_HN.iso88591 +default locale: ID: es_HN, Name: Spanish (Honduras) +display locale: ID: es_HN, Name: Spanish (Honduras) +format locale: ID: es_HN, Name: Spanish (Honduras) +default charset: ISO-8859-1 + +OS Locale: es_HN.utf8 +default locale: ID: es_HN, Name: Spanish (Honduras) +display locale: ID: es_HN, Name: Spanish (Honduras) +format locale: ID: es_HN, Name: Spanish (Honduras) +default charset: UTF-8 + +OS Locale: es_MX +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: ISO-8859-1 + +OS Locale: es_MX.iso88591 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: ISO-8859-1 + +OS Locale: es_MX.utf8 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: UTF-8 + +OS Locale: es_NI +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: ISO-8859-1 + +OS Locale: es_NI.iso88591 +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: ISO-8859-1 + +OS Locale: es_NI.utf8 +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: UTF-8 + +OS Locale: es_PA +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: ISO-8859-1 + +OS Locale: es_PA.iso88591 +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: ISO-8859-1 + +OS Locale: es_PA.utf8 +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: UTF-8 + +OS Locale: es_PE +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: ISO-8859-1 + +OS Locale: es_PE.iso88591 +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: ISO-8859-1 + +OS Locale: es_PE.utf8 +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: UTF-8 + +OS Locale: es_PR +default locale: ID: es_PR, Name: Spanish (Puerto Rico) +display locale: ID: es_PR, Name: Spanish (Puerto Rico) +format locale: ID: es_PR, Name: Spanish (Puerto Rico) +default charset: ISO-8859-1 + +OS Locale: es_PR.iso88591 +default locale: ID: es_PR, Name: Spanish (Puerto Rico) +display locale: ID: es_PR, Name: Spanish (Puerto Rico) +format locale: ID: es_PR, Name: Spanish (Puerto Rico) +default charset: ISO-8859-1 + +OS Locale: es_PR.utf8 +default locale: ID: es_PR, Name: Spanish (Puerto Rico) +display locale: ID: es_PR, Name: Spanish (Puerto Rico) +format locale: ID: es_PR, Name: Spanish (Puerto Rico) +default charset: UTF-8 + +OS Locale: es_PY +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: ISO-8859-1 + +OS Locale: es_PY.iso88591 +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: ISO-8859-1 + +OS Locale: es_PY.utf8 +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: UTF-8 + +OS Locale: es_SV +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: ISO-8859-1 + +OS Locale: es_SV.iso88591 +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: ISO-8859-1 + +OS Locale: es_SV.utf8 +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: UTF-8 + +OS Locale: es_US +default locale: ID: es_US, Name: Spanish (United States) +display locale: ID: es_US, Name: Spanish (United States) +format locale: ID: es_US, Name: Spanish (United States) +default charset: ISO-8859-1 + +OS Locale: es_US.iso88591 +default locale: ID: es_US, Name: Spanish (United States) +display locale: ID: es_US, Name: Spanish (United States) +format locale: ID: es_US, Name: Spanish (United States) +default charset: ISO-8859-1 + +OS Locale: es_US.utf8 +default locale: ID: es_US, Name: Spanish (United States) +display locale: ID: es_US, Name: Spanish (United States) +format locale: ID: es_US, Name: Spanish (United States) +default charset: UTF-8 + +OS Locale: es_UY +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: ISO-8859-1 + +OS Locale: es_UY.iso88591 +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: ISO-8859-1 + +OS Locale: es_UY.utf8 +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: UTF-8 + +OS Locale: es_VE +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: ISO-8859-1 + +OS Locale: es_VE.iso88591 +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: ISO-8859-1 + +OS Locale: es_VE.utf8 +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: UTF-8 + +OS Locale: estonian +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: et_EE +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-1 + +OS Locale: et_EE.iso88591 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-1 + +OS Locale: et_EE.iso885915 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-15 + +OS Locale: et_EE.utf8 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: UTF-8 + +OS Locale: eu_ES +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: ISO-8859-1 + +OS Locale: eu_ES.iso88591 +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: ISO-8859-1 + +OS Locale: eu_ES.iso885915@euro +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: ISO-8859-15 + +OS Locale: eu_ES.utf8 +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: UTF-8 + +OS Locale: eu_ES@euro +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: ISO-8859-15 + +OS Locale: fa_IR +default locale: ID: fa_IR, Name: Persian (Iran) +display locale: ID: fa_IR, Name: Persian (Iran) +format locale: ID: fa_IR, Name: Persian (Iran) +default charset: UTF-8 + +OS Locale: fa_IR.utf8 +default locale: ID: fa_IR, Name: Persian (Iran) +display locale: ID: fa_IR, Name: Persian (Iran) +format locale: ID: fa_IR, Name: Persian (Iran) +default charset: UTF-8 + +OS Locale: fi_FI +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fi_FI.iso88591 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fi_FI.iso885915@euro +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 + +OS Locale: fi_FI.utf8 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: UTF-8 + +OS Locale: fi_FI@euro +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 + +OS Locale: finnish +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fo_FO +default locale: ID: fo_FO, Name: Faroese (Faroe Islands) +display locale: ID: fo_FO, Name: Faroese (Faroe Islands) +format locale: ID: fo_FO, Name: Faroese (Faroe Islands) +default charset: ISO-8859-1 + +OS Locale: fo_FO.iso88591 +default locale: ID: fo_FO, Name: Faroese (Faroe Islands) +display locale: ID: fo_FO, Name: Faroese (Faroe Islands) +format locale: ID: fo_FO, Name: Faroese (Faroe Islands) +default charset: ISO-8859-1 + +OS Locale: fo_FO.utf8 +default locale: ID: fo_FO, Name: Faroese (Faroe Islands) +display locale: ID: fo_FO, Name: Faroese (Faroe Islands) +format locale: ID: fo_FO, Name: Faroese (Faroe Islands) +default charset: UTF-8 + +OS Locale: fr_BE +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-1 + +OS Locale: fr_BE.iso88591 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-1 + +OS Locale: fr_BE.iso885915@euro +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-15 + +OS Locale: fr_BE.utf8 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: UTF-8 + +OS Locale: fr_BE@euro +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-15 + +OS Locale: fr_CA +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: ISO-8859-1 + +OS Locale: fr_CA.iso88591 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: ISO-8859-1 + +OS Locale: fr_CA.utf8 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: UTF-8 + +OS Locale: fr_CH +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: ISO-8859-1 + +OS Locale: fr_CH.iso88591 +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: ISO-8859-1 + +OS Locale: fr_CH.utf8 +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: UTF-8 + +OS Locale: fr_FR +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fr_FR.iso88591 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fr_FR.iso885915@euro +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 + +OS Locale: fr_FR.utf8 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: UTF-8 + +OS Locale: fr_FR@euro +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 + +OS Locale: fr_LU +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: ISO-8859-1 + +OS Locale: fr_LU.iso88591 +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: ISO-8859-1 + +OS Locale: fr_LU.iso885915@euro +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: ISO-8859-15 + +OS Locale: fr_LU.utf8 +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: UTF-8 + +OS Locale: fr_LU@euro +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: ISO-8859-15 + +OS Locale: français +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: french +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fy_NL +default locale: ID: fy_NL, Name: Frisian (Netherlands) +display locale: ID: fy_NL, Name: Frisian (Netherlands) +format locale: ID: fy_NL, Name: Frisian (Netherlands) +default charset: UTF-8 + +OS Locale: fy_NL.utf8 +default locale: ID: fy_NL, Name: Frisian (Netherlands) +display locale: ID: fy_NL, Name: Frisian (Netherlands) +format locale: ID: fy_NL, Name: Frisian (Netherlands) +default charset: UTF-8 + +OS Locale: ga_IE +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: ISO-8859-1 + +OS Locale: ga_IE.iso88591 +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: ISO-8859-1 + +OS Locale: ga_IE.iso885915@euro +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: ISO-8859-15 + +OS Locale: ga_IE.utf8 +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: UTF-8 + +OS Locale: ga_IE@euro +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: ISO-8859-15 + +OS Locale: galego +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: galician +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: gd_GB +default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +default charset: ISO-8859-15 + +OS Locale: gd_GB.iso885915 +default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +default charset: ISO-8859-15 + +OS Locale: gd_GB.utf8 +default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +default charset: UTF-8 + +OS Locale: german +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: gez_ER +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: gez_ER.utf8 +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: gez_ER.utf8@abegede +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: gez_ER@abegede +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: gez_ET +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: gez_ET.utf8 +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: gez_ET.utf8@abegede +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: gez_ET@abegede +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: gl_ES +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: ISO-8859-1 + +OS Locale: gl_ES.iso88591 +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: ISO-8859-1 + +OS Locale: gl_ES.iso885915@euro +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: ISO-8859-15 + +OS Locale: gl_ES.utf8 +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: UTF-8 + +OS Locale: gl_ES@euro +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: ISO-8859-15 + +OS Locale: greek +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: gu_IN +default locale: ID: gu_IN, Name: Gujarati (India) +display locale: ID: gu_IN, Name: Gujarati (India) +format locale: ID: gu_IN, Name: Gujarati (India) +default charset: UTF-8 + +OS Locale: gu_IN.utf8 +default locale: ID: gu_IN, Name: Gujarati (India) +display locale: ID: gu_IN, Name: Gujarati (India) +format locale: ID: gu_IN, Name: Gujarati (India) +default charset: UTF-8 + +OS Locale: gv_GB +default locale: ID: gv_GB, Name: Manx (United Kingdom) +display locale: ID: gv_GB, Name: Manx (United Kingdom) +format locale: ID: gv_GB, Name: Manx (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: gv_GB.iso88591 +default locale: ID: gv_GB, Name: Manx (United Kingdom) +display locale: ID: gv_GB, Name: Manx (United Kingdom) +format locale: ID: gv_GB, Name: Manx (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: gv_GB.utf8 +default locale: ID: gv_GB, Name: Manx (United Kingdom) +display locale: ID: gv_GB, Name: Manx (United Kingdom) +format locale: ID: gv_GB, Name: Manx (United Kingdom) +default charset: UTF-8 + +OS Locale: he_IL +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: he_IL.iso88598 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: he_IL.utf8 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: UTF-8 + +OS Locale: hebrew +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: hi_IN +default locale: ID: hi_IN, Name: Hindi (India) +display locale: ID: hi_IN, Name: Hindi (India) +format locale: ID: hi_IN, Name: Hindi (India) +default charset: UTF-8 + +OS Locale: hi_IN.utf8 +default locale: ID: hi_IN, Name: Hindi (India) +display locale: ID: hi_IN, Name: Hindi (India) +format locale: ID: hi_IN, Name: Hindi (India) +default charset: UTF-8 + +OS Locale: hr_HR +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: hr_HR.iso88592 +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: hr_HR.utf8 +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: UTF-8 + +OS Locale: hrvatski +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: hsb_DE +default locale: ID: en_DE, Name: English (Germany) +display locale: ID: en_DE, Name: English (Germany) +format locale: ID: en_DE, Name: English (Germany) +default charset: ISO-8859-2 + +OS Locale: hsb_DE.iso88592 +default locale: ID: en_DE, Name: English (Germany) +display locale: ID: en_DE, Name: English (Germany) +format locale: ID: en_DE, Name: English (Germany) +default charset: ISO-8859-2 + +OS Locale: hsb_DE.utf8 +default locale: ID: en_DE, Name: English (Germany) +display locale: ID: en_DE, Name: English (Germany) +format locale: ID: en_DE, Name: English (Germany) +default charset: UTF-8 + +OS Locale: hu_HU +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hu_HU.iso88592 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hu_HU.utf8 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: UTF-8 + +OS Locale: hungarian +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hy_AM +default locale: ID: hy_AM, Name: Armenian (Armenia) +display locale: ID: hy_AM, Name: Armenian (Armenia) +format locale: ID: hy_AM, Name: Armenian (Armenia) +default charset: UTF-8 + +OS Locale: hy_AM.armscii8 +default locale: ID: hy_AM, Name: Armenian (Armenia) +display locale: ID: hy_AM, Name: Armenian (Armenia) +format locale: ID: hy_AM, Name: Armenian (Armenia) +default charset: UTF-8 + +OS Locale: hy_AM.utf8 +default locale: ID: hy_AM, Name: Armenian (Armenia) +display locale: ID: hy_AM, Name: Armenian (Armenia) +format locale: ID: hy_AM, Name: Armenian (Armenia) +default charset: UTF-8 + +OS Locale: icelandic +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 + +OS Locale: id_ID +default locale: ID: in_ID, Name: Indonesian (Indonesia) +display locale: ID: in_ID, Name: Indonesian (Indonesia) +format locale: ID: in_ID, Name: Indonesian (Indonesia) +default charset: ISO-8859-1 + +OS Locale: id_ID.iso88591 +default locale: ID: in_ID, Name: Indonesian (Indonesia) +display locale: ID: in_ID, Name: Indonesian (Indonesia) +format locale: ID: in_ID, Name: Indonesian (Indonesia) +default charset: ISO-8859-1 + +OS Locale: id_ID.utf8 +default locale: ID: in_ID, Name: Indonesian (Indonesia) +display locale: ID: in_ID, Name: Indonesian (Indonesia) +format locale: ID: in_ID, Name: Indonesian (Indonesia) +default charset: UTF-8 + +OS Locale: is_IS +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 + +OS Locale: is_IS.iso88591 +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 + +OS Locale: is_IS.utf8 +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: UTF-8 + +OS Locale: it_CH +default locale: ID: it_CH, Name: Italian (Switzerland) +display locale: ID: it_CH, Name: Italian (Switzerland) +format locale: ID: it_CH, Name: Italian (Switzerland) +default charset: ISO-8859-1 + +OS Locale: it_CH.iso88591 +default locale: ID: it_CH, Name: Italian (Switzerland) +display locale: ID: it_CH, Name: Italian (Switzerland) +format locale: ID: it_CH, Name: Italian (Switzerland) +default charset: ISO-8859-1 + +OS Locale: it_CH.utf8 +default locale: ID: it_CH, Name: Italian (Switzerland) +display locale: ID: it_CH, Name: Italian (Switzerland) +format locale: ID: it_CH, Name: Italian (Switzerland) +default charset: UTF-8 + +OS Locale: it_IT +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: it_IT.iso88591 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: it_IT.iso885915@euro +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 + +OS Locale: it_IT.utf8 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: UTF-8 + +OS Locale: it_IT@euro +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 + +OS Locale: italian +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: iw_IL +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: iw_IL.iso88598 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: iw_IL.utf8 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: UTF-8 + +OS Locale: ja_JP +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: ja_JP.eucjp +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: ja_JP.ujis +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: ja_JP.utf8 +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: UTF-8 + +OS Locale: japanese +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: japanese.euc +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: ka_GE +default locale: ID: ka_GE, Name: Georgian (Georgia) +display locale: ID: ka_GE, Name: Georgian (Georgia) +format locale: ID: ka_GE, Name: Georgian (Georgia) +default charset: UTF-8 + +OS Locale: ka_GE.georgianps +default locale: ID: ka_GE, Name: Georgian (Georgia) +display locale: ID: ka_GE, Name: Georgian (Georgia) +format locale: ID: ka_GE, Name: Georgian (Georgia) +default charset: UTF-8 + +OS Locale: ka_GE.utf8 +default locale: ID: ka_GE, Name: Georgian (Georgia) +display locale: ID: ka_GE, Name: Georgian (Georgia) +format locale: ID: ka_GE, Name: Georgian (Georgia) +default charset: UTF-8 + +OS Locale: kk_KZ +default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +default charset: UTF-8 + +OS Locale: kk_KZ.pt154 +default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +default charset: UTF-8 + +OS Locale: kk_KZ.utf8 +default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +default charset: UTF-8 + +OS Locale: kl_GL +default locale: ID: kl_GL, Name: Greenlandic (Greenland) +display locale: ID: kl_GL, Name: Greenlandic (Greenland) +format locale: ID: kl_GL, Name: Greenlandic (Greenland) +default charset: ISO-8859-1 + +OS Locale: kl_GL.iso88591 +default locale: ID: kl_GL, Name: Greenlandic (Greenland) +display locale: ID: kl_GL, Name: Greenlandic (Greenland) +format locale: ID: kl_GL, Name: Greenlandic (Greenland) +default charset: ISO-8859-1 + +OS Locale: kl_GL.utf8 +default locale: ID: kl_GL, Name: Greenlandic (Greenland) +display locale: ID: kl_GL, Name: Greenlandic (Greenland) +format locale: ID: kl_GL, Name: Greenlandic (Greenland) +default charset: UTF-8 + +OS Locale: km_KH +default locale: ID: km_KH, Name: Khmer (Cambodia) +display locale: ID: km_KH, Name: Khmer (Cambodia) +format locale: ID: km_KH, Name: Khmer (Cambodia) +default charset: UTF-8 + +OS Locale: km_KH.utf8 +default locale: ID: km_KH, Name: Khmer (Cambodia) +display locale: ID: km_KH, Name: Khmer (Cambodia) +format locale: ID: km_KH, Name: Khmer (Cambodia) +default charset: UTF-8 + +OS Locale: kn_IN +default locale: ID: kn_IN, Name: Kannada (India) +display locale: ID: kn_IN, Name: Kannada (India) +format locale: ID: kn_IN, Name: Kannada (India) +default charset: UTF-8 + +OS Locale: kn_IN.utf8 +default locale: ID: kn_IN, Name: Kannada (India) +display locale: ID: kn_IN, Name: Kannada (India) +format locale: ID: kn_IN, Name: Kannada (India) +default charset: UTF-8 + +OS Locale: ko_KR +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR + +OS Locale: ko_KR.euckr +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR + +OS Locale: ko_KR.utf8 +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: UTF-8 + +OS Locale: korean +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: EUC-KR + +OS Locale: korean.euc +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: EUC-KR + +OS Locale: ku_TR +default locale: ID: ku_TR, Name: Kurdish (Turkey) +display locale: ID: ku_TR, Name: Kurdish (Turkey) +format locale: ID: ku_TR, Name: Kurdish (Turkey) +default charset: ISO-8859-9 + +OS Locale: ku_TR.iso88599 +default locale: ID: ku_TR, Name: Kurdish (Turkey) +display locale: ID: ku_TR, Name: Kurdish (Turkey) +format locale: ID: ku_TR, Name: Kurdish (Turkey) +default charset: ISO-8859-9 + +OS Locale: ku_TR.utf8 +default locale: ID: ku_TR, Name: Kurdish (Turkey) +display locale: ID: ku_TR, Name: Kurdish (Turkey) +format locale: ID: ku_TR, Name: Kurdish (Turkey) +default charset: UTF-8 + +OS Locale: kw_GB +default locale: ID: kw_GB, Name: Cornish (United Kingdom) +display locale: ID: kw_GB, Name: Cornish (United Kingdom) +format locale: ID: kw_GB, Name: Cornish (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: kw_GB.iso88591 +default locale: ID: kw_GB, Name: Cornish (United Kingdom) +display locale: ID: kw_GB, Name: Cornish (United Kingdom) +format locale: ID: kw_GB, Name: Cornish (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: kw_GB.utf8 +default locale: ID: kw_GB, Name: Cornish (United Kingdom) +display locale: ID: kw_GB, Name: Cornish (United Kingdom) +format locale: ID: kw_GB, Name: Cornish (United Kingdom) +default charset: UTF-8 + +OS Locale: ky_KG +default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +display locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +default charset: UTF-8 + +OS Locale: ky_KG.utf8 +default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +display locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +default charset: UTF-8 + +OS Locale: lg_UG +default locale: ID: lg_UG, Name: Ganda (Uganda) +display locale: ID: lg_UG, Name: Ganda (Uganda) +format locale: ID: lg_UG, Name: Ganda (Uganda) +default charset: UTF-8 + +OS Locale: lg_UG.iso885910 +default locale: ID: lg_UG, Name: Ganda (Uganda) +display locale: ID: lg_UG, Name: Ganda (Uganda) +format locale: ID: lg_UG, Name: Ganda (Uganda) +default charset: UTF-8 + +OS Locale: lg_UG.utf8 +default locale: ID: lg_UG, Name: Ganda (Uganda) +display locale: ID: lg_UG, Name: Ganda (Uganda) +format locale: ID: lg_UG, Name: Ganda (Uganda) +default charset: UTF-8 + +OS Locale: lithuanian +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-13 + +OS Locale: lo_LA +default locale: ID: lo_LA, Name: Lao (Laos) +display locale: ID: lo_LA, Name: Lao (Laos) +format locale: ID: lo_LA, Name: Lao (Laos) +default charset: UTF-8 + +OS Locale: lo_LA.utf8 +default locale: ID: lo_LA, Name: Lao (Laos) +display locale: ID: lo_LA, Name: Lao (Laos) +format locale: ID: lo_LA, Name: Lao (Laos) +default charset: UTF-8 + +OS Locale: lt_LT +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 + +OS Locale: lt_LT.iso885913 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 + +OS Locale: lt_LT.utf8 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: UTF-8 + +OS Locale: lv_LV +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 + +OS Locale: lv_LV.iso885913 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 + +OS Locale: lv_LV.utf8 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: UTF-8 + +OS Locale: mai_IN +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: UTF-8 + +OS Locale: mai_IN.utf8 +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: UTF-8 + +OS Locale: mg_MG +default locale: ID: mg_MG, Name: Malagasy (Madagascar) +display locale: ID: mg_MG, Name: Malagasy (Madagascar) +format locale: ID: mg_MG, Name: Malagasy (Madagascar) +default charset: ISO-8859-15 + +OS Locale: mg_MG.iso885915 +default locale: ID: mg_MG, Name: Malagasy (Madagascar) +display locale: ID: mg_MG, Name: Malagasy (Madagascar) +format locale: ID: mg_MG, Name: Malagasy (Madagascar) +default charset: ISO-8859-15 + +OS Locale: mg_MG.utf8 +default locale: ID: mg_MG, Name: Malagasy (Madagascar) +display locale: ID: mg_MG, Name: Malagasy (Madagascar) +format locale: ID: mg_MG, Name: Malagasy (Madagascar) +default charset: UTF-8 + +OS Locale: mi_NZ +default locale: ID: mi_NZ, Name: Maori (New Zealand) +display locale: ID: mi_NZ, Name: Maori (New Zealand) +format locale: ID: mi_NZ, Name: Maori (New Zealand) +default charset: ISO-8859-13 + +OS Locale: mi_NZ.iso885913 +default locale: ID: mi_NZ, Name: Maori (New Zealand) +display locale: ID: mi_NZ, Name: Maori (New Zealand) +format locale: ID: mi_NZ, Name: Maori (New Zealand) +default charset: ISO-8859-13 + +OS Locale: mi_NZ.utf8 +default locale: ID: mi_NZ, Name: Maori (New Zealand) +display locale: ID: mi_NZ, Name: Maori (New Zealand) +format locale: ID: mi_NZ, Name: Maori (New Zealand) +default charset: UTF-8 + +OS Locale: mk_MK +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: ISO-8859-5 + +OS Locale: mk_MK.iso88595 +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: ISO-8859-5 + +OS Locale: mk_MK.utf8 +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: UTF-8 + +OS Locale: ml_IN +default locale: ID: ml_IN, Name: Malayalam (India) +display locale: ID: ml_IN, Name: Malayalam (India) +format locale: ID: ml_IN, Name: Malayalam (India) +default charset: UTF-8 + +OS Locale: ml_IN.utf8 +default locale: ID: ml_IN, Name: Malayalam (India) +display locale: ID: ml_IN, Name: Malayalam (India) +format locale: ID: ml_IN, Name: Malayalam (India) +default charset: UTF-8 + +OS Locale: mn_MN +default locale: ID: mn_MN, Name: Mongolian (Mongolia) +display locale: ID: mn_MN, Name: Mongolian (Mongolia) +format locale: ID: mn_MN, Name: Mongolian (Mongolia) +default charset: UTF-8 + +OS Locale: mn_MN.utf8 +default locale: ID: mn_MN, Name: Mongolian (Mongolia) +display locale: ID: mn_MN, Name: Mongolian (Mongolia) +format locale: ID: mn_MN, Name: Mongolian (Mongolia) +default charset: UTF-8 + +OS Locale: mr_IN +default locale: ID: mr_IN, Name: Marathi (India) +display locale: ID: mr_IN, Name: Marathi (India) +format locale: ID: mr_IN, Name: Marathi (India) +default charset: UTF-8 + +OS Locale: mr_IN.utf8 +default locale: ID: mr_IN, Name: Marathi (India) +display locale: ID: mr_IN, Name: Marathi (India) +format locale: ID: mr_IN, Name: Marathi (India) +default charset: UTF-8 + +OS Locale: ms_MY +default locale: ID: ms_MY, Name: Malay (Malaysia) +display locale: ID: ms_MY, Name: Malay (Malaysia) +format locale: ID: ms_MY, Name: Malay (Malaysia) +default charset: ISO-8859-1 + +OS Locale: ms_MY.iso88591 +default locale: ID: ms_MY, Name: Malay (Malaysia) +display locale: ID: ms_MY, Name: Malay (Malaysia) +format locale: ID: ms_MY, Name: Malay (Malaysia) +default charset: ISO-8859-1 + +OS Locale: ms_MY.utf8 +default locale: ID: ms_MY, Name: Malay (Malaysia) +display locale: ID: ms_MY, Name: Malay (Malaysia) +format locale: ID: ms_MY, Name: Malay (Malaysia) +default charset: UTF-8 + +OS Locale: mt_MT +default locale: ID: mt_MT, Name: Maltese (Malta) +display locale: ID: mt_MT, Name: Maltese (Malta) +format locale: ID: mt_MT, Name: Maltese (Malta) +default charset: ISO-8859-3 + +OS Locale: mt_MT.iso88593 +default locale: ID: mt_MT, Name: Maltese (Malta) +display locale: ID: mt_MT, Name: Maltese (Malta) +format locale: ID: mt_MT, Name: Maltese (Malta) +default charset: ISO-8859-3 + +OS Locale: mt_MT.utf8 +default locale: ID: mt_MT, Name: Maltese (Malta) +display locale: ID: mt_MT, Name: Maltese (Malta) +format locale: ID: mt_MT, Name: Maltese (Malta) +default charset: UTF-8 + +OS Locale: nb_NO +default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +default charset: ISO-8859-1 + +OS Locale: nb_NO.iso88591 +default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +default charset: ISO-8859-1 + +OS Locale: nb_NO.utf8 +default locale: ID: nb_NO, Name: Norwegian BokmÃ¥l (Norway) +display locale: ID: nb_NO, Name: Norwegian BokmÃ¥l (Norway) +format locale: ID: nb_NO, Name: Norwegian BokmÃ¥l (Norway) +default charset: UTF-8 + +OS Locale: ne_NP +default locale: ID: ne_NP, Name: Nepali (Nepal) +display locale: ID: ne_NP, Name: Nepali (Nepal) +format locale: ID: ne_NP, Name: Nepali (Nepal) +default charset: UTF-8 + +OS Locale: ne_NP.utf8 +default locale: ID: ne_NP, Name: Nepali (Nepal) +display locale: ID: ne_NP, Name: Nepali (Nepal) +format locale: ID: ne_NP, Name: Nepali (Nepal) +default charset: UTF-8 + +OS Locale: nl_BE +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-1 + +OS Locale: nl_BE.iso88591 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-1 + +OS Locale: nl_BE.iso885915@euro +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-15 + +OS Locale: nl_BE.utf8 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: UTF-8 + +OS Locale: nl_BE@euro +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-15 + +OS Locale: nl_NL +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: nl_NL.iso88591 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: nl_NL.iso885915@euro +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 + +OS Locale: nl_NL.utf8 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: UTF-8 + +OS Locale: nl_NL@euro +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 + +OS Locale: nn_NO +default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +default charset: ISO-8859-1 + +OS Locale: nn_NO.iso88591 +default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +default charset: ISO-8859-1 + +OS Locale: nn_NO.utf8 +default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +default charset: UTF-8 + +OS Locale: no_NO +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: no_NO.iso88591 +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: no_NO.utf8 +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: UTF-8 + +OS Locale: norwegian +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: nr_ZA +default locale: ID: nr_ZA, Name: South Ndebele (South Africa) +display locale: ID: nr_ZA, Name: South Ndebele (South Africa) +format locale: ID: nr_ZA, Name: South Ndebele (South Africa) +default charset: UTF-8 + +OS Locale: nr_ZA.utf8 +default locale: ID: nr_ZA, Name: South Ndebele (South Africa) +display locale: ID: nr_ZA, Name: South Ndebele (South Africa) +format locale: ID: nr_ZA, Name: South Ndebele (South Africa) +default charset: UTF-8 + +OS Locale: nso_ZA +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: UTF-8 + +OS Locale: nso_ZA.utf8 +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: UTF-8 + +OS Locale: nynorsk +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: oc_FR +default locale: ID: oc_FR, Name: Occitan (France) +display locale: ID: oc_FR, Name: Occitan (France) +format locale: ID: oc_FR, Name: Occitan (France) +default charset: ISO-8859-1 + +OS Locale: oc_FR.iso88591 +default locale: ID: oc_FR, Name: Occitan (France) +display locale: ID: oc_FR, Name: Occitan (France) +format locale: ID: oc_FR, Name: Occitan (France) +default charset: ISO-8859-1 + +OS Locale: oc_FR.utf8 +default locale: ID: oc_FR, Name: Occitan (France) +display locale: ID: oc_FR, Name: Occitan (France) +format locale: ID: oc_FR, Name: Occitan (France) +default charset: UTF-8 + +OS Locale: om_ET +default locale: ID: om_ET, Name: Oromo (Ethiopia) +display locale: ID: om_ET, Name: Oromo (Ethiopia) +format locale: ID: om_ET, Name: Oromo (Ethiopia) +default charset: UTF-8 + +OS Locale: om_ET.utf8 +default locale: ID: om_ET, Name: Oromo (Ethiopia) +display locale: ID: om_ET, Name: Oromo (Ethiopia) +format locale: ID: om_ET, Name: Oromo (Ethiopia) +default charset: UTF-8 + +OS Locale: om_KE +default locale: ID: om_KE, Name: Oromo (Kenya) +display locale: ID: om_KE, Name: Oromo (Kenya) +format locale: ID: om_KE, Name: Oromo (Kenya) +default charset: ISO-8859-1 + +OS Locale: om_KE.iso88591 +default locale: ID: om_KE, Name: Oromo (Kenya) +display locale: ID: om_KE, Name: Oromo (Kenya) +format locale: ID: om_KE, Name: Oromo (Kenya) +default charset: ISO-8859-1 + +OS Locale: om_KE.utf8 +default locale: ID: om_KE, Name: Oromo (Kenya) +display locale: ID: om_KE, Name: Oromo (Kenya) +format locale: ID: om_KE, Name: Oromo (Kenya) +default charset: UTF-8 + +OS Locale: or_IN +default locale: ID: or_IN, Name: Oriya (India) +display locale: ID: or_IN, Name: Oriya (India) +format locale: ID: or_IN, Name: Oriya (India) +default charset: UTF-8 + +OS Locale: or_IN.utf8 +default locale: ID: or_IN, Name: Oriya (India) +display locale: ID: or_IN, Name: Oriya (India) +format locale: ID: or_IN, Name: Oriya (India) +default charset: UTF-8 + +OS Locale: pa_IN +default locale: ID: pa_IN, Name: Panjabi (India) +display locale: ID: pa_IN, Name: Panjabi (India) +format locale: ID: pa_IN, Name: Panjabi (India) +default charset: UTF-8 + +OS Locale: pa_IN.utf8 +default locale: ID: pa_IN, Name: Panjabi (India) +display locale: ID: pa_IN, Name: Panjabi (India) +format locale: ID: pa_IN, Name: Panjabi (India) +default charset: UTF-8 + +OS Locale: pa_PK +default locale: ID: pa_PK, Name: Panjabi (Pakistan) +display locale: ID: pa_PK, Name: Panjabi (Pakistan) +format locale: ID: pa_PK, Name: Panjabi (Pakistan) +default charset: UTF-8 + +OS Locale: pa_PK.utf8 +default locale: ID: pa_PK, Name: Panjabi (Pakistan) +display locale: ID: pa_PK, Name: Panjabi (Pakistan) +format locale: ID: pa_PK, Name: Panjabi (Pakistan) +default charset: UTF-8 + +OS Locale: pl_PL +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: pl_PL.iso88592 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: pl_PL.utf8 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: UTF-8 + +OS Locale: polish +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: portuguese +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt_BR +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: ISO-8859-1 + +OS Locale: pt_BR.iso88591 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: ISO-8859-1 + +OS Locale: pt_BR.utf8 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: UTF-8 + +OS Locale: pt_PT +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt_PT.iso88591 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt_PT.iso885915@euro +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 + +OS Locale: pt_PT.utf8 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: UTF-8 + +OS Locale: pt_PT@euro +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 + +OS Locale: ro_RO +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 + +OS Locale: ro_RO.iso88592 +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 + +OS Locale: ro_RO.utf8 +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: UTF-8 + +OS Locale: romanian +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 + +OS Locale: ru_RU +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: ru_RU.iso88595 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: ru_RU.koi8r +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: KOI8-R + +OS Locale: ru_RU.utf8 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: UTF-8 + +OS Locale: ru_UA +default locale: ID: ru_UA, Name: Russian (Ukraine) +display locale: ID: ru_UA, Name: Russian (Ukraine) +format locale: ID: ru_UA, Name: Russian (Ukraine) +default charset: KOI8-U + +OS Locale: ru_UA.koi8u +default locale: ID: ru_UA, Name: Russian (Ukraine) +display locale: ID: ru_UA, Name: Russian (Ukraine) +format locale: ID: ru_UA, Name: Russian (Ukraine) +default charset: KOI8-U + +OS Locale: ru_UA.utf8 +default locale: ID: ru_UA, Name: Russian (Ukraine) +display locale: ID: ru_UA, Name: Russian (Ukraine) +format locale: ID: ru_UA, Name: Russian (Ukraine) +default charset: UTF-8 + +OS Locale: russian +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: rw_RW +default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +display locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +default charset: UTF-8 + +OS Locale: rw_RW.utf8 +default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +display locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +default charset: UTF-8 + +OS Locale: se_NO +default locale: ID: se_NO, Name: Northern Sami (Norway) +display locale: ID: se_NO, Name: Northern Sami (Norway) +format locale: ID: se_NO, Name: Northern Sami (Norway) +default charset: UTF-8 + +OS Locale: se_NO.utf8 +default locale: ID: se_NO, Name: Northern Sami (Norway) +display locale: ID: se_NO, Name: Northern Sami (Norway) +format locale: ID: se_NO, Name: Northern Sami (Norway) +default charset: UTF-8 + +OS Locale: si_LK +default locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +display locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +format locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +default charset: UTF-8 + +OS Locale: si_LK.utf8 +default locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +display locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +format locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +default charset: UTF-8 + +OS Locale: sid_ET +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: sid_ET.utf8 +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: sk_SK +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 + +OS Locale: sk_SK.iso88592 +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 + +OS Locale: sk_SK.utf8 +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: UTF-8 + +OS Locale: sl_SI +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: sl_SI.iso88592 +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: sl_SI.utf8 +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: UTF-8 + +OS Locale: slovak +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 + +OS Locale: slovene +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: slovenian +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: so_DJ +default locale: ID: so_DJ, Name: Somali (Djibouti) +display locale: ID: so_DJ, Name: Somali (Djibouti) +format locale: ID: so_DJ, Name: Somali (Djibouti) +default charset: ISO-8859-1 + +OS Locale: so_DJ.iso88591 +default locale: ID: so_DJ, Name: Somali (Djibouti) +display locale: ID: so_DJ, Name: Somali (Djibouti) +format locale: ID: so_DJ, Name: Somali (Djibouti) +default charset: ISO-8859-1 + +OS Locale: so_DJ.utf8 +default locale: ID: so_DJ, Name: Somali (Djibouti) +display locale: ID: so_DJ, Name: Somali (Djibouti) +format locale: ID: so_DJ, Name: Somali (Djibouti) +default charset: UTF-8 + +OS Locale: so_ET +default locale: ID: so_ET, Name: Somali (Ethiopia) +display locale: ID: so_ET, Name: Somali (Ethiopia) +format locale: ID: so_ET, Name: Somali (Ethiopia) +default charset: UTF-8 + +OS Locale: so_ET.utf8 +default locale: ID: so_ET, Name: Somali (Ethiopia) +display locale: ID: so_ET, Name: Somali (Ethiopia) +format locale: ID: so_ET, Name: Somali (Ethiopia) +default charset: UTF-8 + +OS Locale: so_KE +default locale: ID: so_KE, Name: Somali (Kenya) +display locale: ID: so_KE, Name: Somali (Kenya) +format locale: ID: so_KE, Name: Somali (Kenya) +default charset: ISO-8859-1 + +OS Locale: so_KE.iso88591 +default locale: ID: so_KE, Name: Somali (Kenya) +display locale: ID: so_KE, Name: Somali (Kenya) +format locale: ID: so_KE, Name: Somali (Kenya) +default charset: ISO-8859-1 + +OS Locale: so_KE.utf8 +default locale: ID: so_KE, Name: Somali (Kenya) +display locale: ID: so_KE, Name: Somali (Kenya) +format locale: ID: so_KE, Name: Somali (Kenya) +default charset: UTF-8 + +OS Locale: so_SO +default locale: ID: so_SO, Name: Somali (Somalia) +display locale: ID: so_SO, Name: Somali (Somalia) +format locale: ID: so_SO, Name: Somali (Somalia) +default charset: ISO-8859-1 + +OS Locale: so_SO.iso88591 +default locale: ID: so_SO, Name: Somali (Somalia) +display locale: ID: so_SO, Name: Somali (Somalia) +format locale: ID: so_SO, Name: Somali (Somalia) +default charset: ISO-8859-1 + +OS Locale: so_SO.utf8 +default locale: ID: so_SO, Name: Somali (Somalia) +display locale: ID: so_SO, Name: Somali (Somalia) +format locale: ID: so_SO, Name: Somali (Somalia) +default charset: UTF-8 + +OS Locale: spanish +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: sq_AL +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: ISO-8859-1 + +OS Locale: sq_AL.iso88591 +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: ISO-8859-1 + +OS Locale: sq_AL.utf8 +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: UTF-8 + +OS Locale: sr_CS +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: ISO-8859-5 + +OS Locale: sr_CS.iso88595 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: ISO-8859-5 + +OS Locale: sr_CS.utf8 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: UTF-8 + +OS Locale: sr_ME +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_ME.utf8 +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_RS +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_RS.utf8 +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_RS.utf8@latin +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_RS@latin +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: ss_ZA +default locale: ID: ss_ZA, Name: Swati (South Africa) +display locale: ID: ss_ZA, Name: Swati (South Africa) +format locale: ID: ss_ZA, Name: Swati (South Africa) +default charset: UTF-8 + +OS Locale: ss_ZA.utf8 +default locale: ID: ss_ZA, Name: Swati (South Africa) +display locale: ID: ss_ZA, Name: Swati (South Africa) +format locale: ID: ss_ZA, Name: Swati (South Africa) +default charset: UTF-8 + +OS Locale: st_ZA +default locale: ID: st_ZA, Name: Southern Sotho (South Africa) +display locale: ID: st_ZA, Name: Southern Sotho (South Africa) +format locale: ID: st_ZA, Name: Southern Sotho (South Africa) +default charset: ISO-8859-1 + +OS Locale: st_ZA.iso88591 +default locale: ID: st_ZA, Name: Southern Sotho (South Africa) +display locale: ID: st_ZA, Name: Southern Sotho (South Africa) +format locale: ID: st_ZA, Name: Southern Sotho (South Africa) +default charset: ISO-8859-1 + +OS Locale: st_ZA.utf8 +default locale: ID: st_ZA, Name: Southern Sotho (South Africa) +display locale: ID: st_ZA, Name: Southern Sotho (South Africa) +format locale: ID: st_ZA, Name: Southern Sotho (South Africa) +default charset: UTF-8 + +OS Locale: sv_FI +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: ISO-8859-1 + +OS Locale: sv_FI.iso88591 +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: ISO-8859-1 + +OS Locale: sv_FI.iso885915@euro +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: ISO-8859-15 + +OS Locale: sv_FI.utf8 +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: UTF-8 + +OS Locale: sv_FI@euro +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: ISO-8859-15 + +OS Locale: sv_SE +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: sv_SE.iso88591 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: sv_SE.iso885915 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-15 + +OS Locale: sv_SE.utf8 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: UTF-8 + +OS Locale: swedish +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: ta_IN +default locale: ID: ta_IN, Name: Tamil (India) +display locale: ID: ta_IN, Name: Tamil (India) +format locale: ID: ta_IN, Name: Tamil (India) +default charset: UTF-8 + +OS Locale: ta_IN.utf8 +default locale: ID: ta_IN, Name: Tamil (India) +display locale: ID: ta_IN, Name: Tamil (India) +format locale: ID: ta_IN, Name: Tamil (India) +default charset: UTF-8 + +OS Locale: te_IN +default locale: ID: te_IN, Name: Telugu (India) +display locale: ID: te_IN, Name: Telugu (India) +format locale: ID: te_IN, Name: Telugu (India) +default charset: UTF-8 + +OS Locale: te_IN.utf8 +default locale: ID: te_IN, Name: Telugu (India) +display locale: ID: te_IN, Name: Telugu (India) +format locale: ID: te_IN, Name: Telugu (India) +default charset: UTF-8 + +OS Locale: tg_TJ +default locale: ID: tg_TJ, Name: Tajik (Tajikistan) +display locale: ID: tg_TJ, Name: Tajik (Tajikistan) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: UTF-8 + +OS Locale: tg_TJ.koi8t +default locale: ID: tg_TJ, Name: Tajik (Tajikistan) +display locale: ID: tg_TJ, Name: Tajik (Tajikistan) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: UTF-8 + +OS Locale: tg_TJ.utf8 +default locale: ID: tg_TJ, Name: Tajik (Tajikistan) +display locale: ID: tg_TJ, Name: Tajik (Tajikistan) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: UTF-8 + +OS Locale: th_TH +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 + +OS Locale: th_TH.tis620 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 + +OS Locale: th_TH.utf8 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: UTF-8 + +OS Locale: thai +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: TIS-620 + +OS Locale: ti_ER +default locale: ID: ti_ER, Name: Tigrinya (Eritrea) +display locale: ID: ti_ER, Name: Tigrinya (Eritrea) +format locale: ID: ti_ER, Name: Tigrinya (Eritrea) +default charset: UTF-8 + +OS Locale: ti_ER.utf8 +default locale: ID: ti_ER, Name: Tigrinya (Eritrea) +display locale: ID: ti_ER, Name: Tigrinya (Eritrea) +format locale: ID: ti_ER, Name: Tigrinya (Eritrea) +default charset: UTF-8 + +OS Locale: ti_ET +default locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +display locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +format locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +default charset: UTF-8 + +OS Locale: ti_ET.utf8 +default locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +display locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +format locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +default charset: UTF-8 + +OS Locale: tig_ER +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: tig_ER.utf8 +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: tl_PH +default locale: ID: tl_PH, Name: Tagalog (Philippines) +display locale: ID: tl_PH, Name: Tagalog (Philippines) +format locale: ID: tl_PH, Name: Tagalog (Philippines) +default charset: ISO-8859-1 + +OS Locale: tl_PH.iso88591 +default locale: ID: tl_PH, Name: Tagalog (Philippines) +display locale: ID: tl_PH, Name: Tagalog (Philippines) +format locale: ID: tl_PH, Name: Tagalog (Philippines) +default charset: ISO-8859-1 + +OS Locale: tl_PH.utf8 +default locale: ID: tl_PH, Name: Tagalog (Philippines) +display locale: ID: tl_PH, Name: Tagalog (Philippines) +format locale: ID: tl_PH, Name: Tagalog (Philippines) +default charset: UTF-8 + +OS Locale: tn_ZA +default locale: ID: tn_ZA, Name: Tswana (South Africa) +display locale: ID: tn_ZA, Name: Tswana (South Africa) +format locale: ID: tn_ZA, Name: Tswana (South Africa) +default charset: UTF-8 + +OS Locale: tn_ZA.utf8 +default locale: ID: tn_ZA, Name: Tswana (South Africa) +display locale: ID: tn_ZA, Name: Tswana (South Africa) +format locale: ID: tn_ZA, Name: Tswana (South Africa) +default charset: UTF-8 + +OS Locale: tr_CY +default locale: ID: tr_CY, Name: Turkish (Cyprus) +display locale: ID: tr_CY, Name: Turkish (Cyprus) +format locale: ID: tr_CY, Name: Turkish (Cyprus) +default charset: ISO-8859-9 + +OS Locale: tr_CY.iso88599 +default locale: ID: tr_CY, Name: Turkish (Cyprus) +display locale: ID: tr_CY, Name: Turkish (Cyprus) +format locale: ID: tr_CY, Name: Turkish (Cyprus) +default charset: ISO-8859-9 + +OS Locale: tr_CY.utf8 +default locale: ID: tr_CY, Name: Turkish (Cyprus) +display locale: ID: tr_CY, Name: Turkish (Cyprus) +format locale: ID: tr_CY, Name: Turkish (Cyprus) +default charset: UTF-8 + +OS Locale: tr_TR +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: tr_TR.iso88599 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: tr_TR.utf8 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: UTF-8 + +OS Locale: ts_ZA +default locale: ID: ts_ZA, Name: Tsonga (South Africa) +display locale: ID: ts_ZA, Name: Tsonga (South Africa) +format locale: ID: ts_ZA, Name: Tsonga (South Africa) +default charset: UTF-8 + +OS Locale: ts_ZA.utf8 +default locale: ID: ts_ZA, Name: Tsonga (South Africa) +display locale: ID: ts_ZA, Name: Tsonga (South Africa) +format locale: ID: ts_ZA, Name: Tsonga (South Africa) +default charset: UTF-8 + +OS Locale: tt_RU.utf8 +default locale: ID: tt_RU, Name: Tatar (Russia) +display locale: ID: tt_RU, Name: Tatar (Russia) +format locale: ID: tt_RU, Name: Tatar (Russia) +default charset: UTF-8 + +OS Locale: turkish +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: uk_UA +default locale: ID: uk_UA, Name: Ukrainian (Ukraine) +display locale: ID: uk_UA, Name: Ukrainian (Ukraine) +format locale: ID: uk_UA, Name: Ukrainian (Ukraine) +default charset: KOI8-U + +OS Locale: uk_UA.koi8u +default locale: ID: uk_UA, Name: Ukrainian (Ukraine) +display locale: ID: uk_UA, Name: Ukrainian (Ukraine) +format locale: ID: uk_UA, Name: Ukrainian (Ukraine) +default charset: KOI8-U + +OS Locale: uk_UA.utf8 +default locale: ID: uk_UA, Name: Ukrainian (Ukraine) +display locale: ID: uk_UA, Name: Ukrainian (Ukraine) +format locale: ID: uk_UA, Name: Ukrainian (Ukraine) +default charset: UTF-8 + +OS Locale: ur_PK +default locale: ID: ur_PK, Name: Urdu (Pakistan) +display locale: ID: ur_PK, Name: Urdu (Pakistan) +format locale: ID: ur_PK, Name: Urdu (Pakistan) +default charset: UTF-8 + +OS Locale: ur_PK.utf8 +default locale: ID: ur_PK, Name: Urdu (Pakistan) +display locale: ID: ur_PK, Name: Urdu (Pakistan) +format locale: ID: ur_PK, Name: Urdu (Pakistan) +default charset: UTF-8 + +OS Locale: uz_UZ +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: ISO-8859-1 + +OS Locale: uz_UZ.iso88591 +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: ISO-8859-1 + +OS Locale: uz_UZ.utf8@cyrillic +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: UTF-8 + +OS Locale: uz_UZ@cyrillic +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: UTF-8 + +OS Locale: ve_ZA +default locale: ID: ve_ZA, Name: Venda (South Africa) +display locale: ID: ve_ZA, Name: Venda (South Africa) +format locale: ID: ve_ZA, Name: Venda (South Africa) +default charset: UTF-8 + +OS Locale: ve_ZA.utf8 +default locale: ID: ve_ZA, Name: Venda (South Africa) +display locale: ID: ve_ZA, Name: Venda (South Africa) +format locale: ID: ve_ZA, Name: Venda (South Africa) +default charset: UTF-8 + +OS Locale: vi_VN +default locale: ID: vi_VN, Name: Vietnamese (Vietnam) +display locale: ID: vi_VN, Name: Vietnamese (Vietnam) +format locale: ID: vi_VN, Name: Vietnamese (Vietnam) +default charset: UTF-8 + +OS Locale: vi_VN.tcvn +default locale: ID: vi_VN, Name: Vietnamese (Vietnam) +display locale: ID: vi_VN, Name: Vietnamese (Vietnam) +format locale: ID: vi_VN, Name: Vietnamese (Vietnam) +default charset: UTF-8 + +OS Locale: vi_VN.utf8 +default locale: ID: vi_VN, Name: Vietnamese (Vietnam) +display locale: ID: vi_VN, Name: Vietnamese (Vietnam) +format locale: ID: vi_VN, Name: Vietnamese (Vietnam) +default charset: UTF-8 + +OS Locale: wa_BE +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: ISO-8859-1 + +OS Locale: wa_BE.iso88591 +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: ISO-8859-1 + +OS Locale: wa_BE.iso885915@euro +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: ISO-8859-15 + +OS Locale: wa_BE.utf8 +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: UTF-8 + +OS Locale: wa_BE@euro +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: ISO-8859-15 + +OS Locale: xh_ZA +default locale: ID: xh_ZA, Name: Xhosa (South Africa) +display locale: ID: xh_ZA, Name: Xhosa (South Africa) +format locale: ID: xh_ZA, Name: Xhosa (South Africa) +default charset: ISO-8859-1 + +OS Locale: xh_ZA.iso88591 +default locale: ID: xh_ZA, Name: Xhosa (South Africa) +display locale: ID: xh_ZA, Name: Xhosa (South Africa) +format locale: ID: xh_ZA, Name: Xhosa (South Africa) +default charset: ISO-8859-1 + +OS Locale: xh_ZA.utf8 +default locale: ID: xh_ZA, Name: Xhosa (South Africa) +display locale: ID: xh_ZA, Name: Xhosa (South Africa) +format locale: ID: xh_ZA, Name: Xhosa (South Africa) +default charset: UTF-8 + +OS Locale: yi_US +default locale: ID: ji_US, Name: Yiddish (United States) +display locale: ID: ji_US, Name: Yiddish (United States) +format locale: ID: ji_US, Name: Yiddish (United States) +default charset: windows-1255 + +OS Locale: yi_US.cp1255 +default locale: ID: ji_US, Name: Yiddish (United States) +display locale: ID: ji_US, Name: Yiddish (United States) +format locale: ID: ji_US, Name: Yiddish (United States) +default charset: windows-1255 + +OS Locale: yi_US.utf8 +default locale: ID: ji_US, Name: Yiddish (United States) +display locale: ID: ji_US, Name: Yiddish (United States) +format locale: ID: ji_US, Name: Yiddish (United States) +default charset: UTF-8 + +OS Locale: zh_CN +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh_CN.gb18030 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 + +OS Locale: zh_CN.gb2312 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh_CN.gbk +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale: zh_CN.utf8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale: zh_HK +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: Big5-HKSCS + +OS Locale: zh_HK.big5hkscs +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: Big5-HKSCS + +OS Locale: zh_HK.utf8 +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: UTF-8 + +OS Locale: zh_SG +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: zh_SG, Name: Chinese (Singapore) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: GB2312 + +OS Locale: zh_SG.gb2312 +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: zh_SG, Name: Chinese (Singapore) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: GB2312 + +OS Locale: zh_SG.gbk +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: zh_SG, Name: Chinese (Singapore) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: GBK + +OS Locale: zh_SG.utf8 +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: zh_SG, Name: Chinese (Singapore) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: UTF-8 + +OS Locale: zh_TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: Big5 + +OS Locale: zh_TW.big5 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: Big5 + +OS Locale: zh_TW.euctw +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW + +OS Locale: zh_TW.utf8 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 + +OS Locale: zu_ZA +default locale: ID: zu_ZA, Name: Zulu (South Africa) +display locale: ID: zu_ZA, Name: Zulu (South Africa) +format locale: ID: zu_ZA, Name: Zulu (South Africa) +default charset: ISO-8859-1 + +OS Locale: zu_ZA.iso88591 +default locale: ID: zu_ZA, Name: Zulu (South Africa) +display locale: ID: zu_ZA, Name: Zulu (South Africa) +format locale: ID: zu_ZA, Name: Zulu (South Africa) +default charset: ISO-8859-1 + +OS Locale: zu_ZA.utf8 +default locale: ID: zu_ZA, Name: Zulu (South Africa) +display locale: ID: zu_ZA, Name: Zulu (South Africa) +format locale: ID: zu_ZA, Name: Zulu (South Africa) +default charset: UTF-8 + +Testing some typical combinations + + +OS Locale (LC_CTYPE: ja_JP.UTF-8, LC_MESSAGES: zh_CN.UTF-8) +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: UTF-8 + +OS Locale (LC_CTYPE: zh_CN.UTF-8, LC_MESSAGES: en_US.UTF-8) +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale (LC_CTYPE: C, LC_MESSAGES: zh_CN.UTF-8) +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: en_US, Name: English (United States) +default charset: US-ASCII diff --git a/jdk/test/java/util/Locale/data/deflocale.rhel5.fmtasdefault b/jdk/test/java/util/Locale/data/deflocale.rhel5.fmtasdefault new file mode 100644 index 00000000000..4914d1833fc --- /dev/null +++ b/jdk/test/java/util/Locale/data/deflocale.rhel5.fmtasdefault @@ -0,0 +1,3924 @@ +Red Hat Enterprise Linux Server release 5.3 (Tikanga) +Linux localhost.localdomain 2.6.18-128.el5 #1 SMP Wed Dec 17 11:42:39 EST 2008 i686 i686 i386 GNU/Linux +Testing all available locales + +OS Locale: C +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: US-ASCII + +OS Locale: POSIX +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: US-ASCII + +OS Locale: aa_DJ +default locale: ID: aa_DJ, Name: Afar (Djibouti) +display locale: ID: aa_DJ, Name: Afar (Djibouti) +format locale: ID: aa_DJ, Name: Afar (Djibouti) +default charset: ISO-8859-1 + +OS Locale: aa_DJ.iso88591 +default locale: ID: aa_DJ, Name: Afar (Djibouti) +display locale: ID: aa_DJ, Name: Afar (Djibouti) +format locale: ID: aa_DJ, Name: Afar (Djibouti) +default charset: ISO-8859-1 + +OS Locale: aa_DJ.utf8 +default locale: ID: aa_DJ, Name: Afar (Djibouti) +display locale: ID: aa_DJ, Name: Afar (Djibouti) +format locale: ID: aa_DJ, Name: Afar (Djibouti) +default charset: UTF-8 + +OS Locale: aa_ER +default locale: ID: aa_ER, Name: Afar (Eritrea) +display locale: ID: aa_ER, Name: Afar (Eritrea) +format locale: ID: aa_ER, Name: Afar (Eritrea) +default charset: UTF-8 + +OS Locale: aa_ER.utf8 +default locale: ID: aa_ER, Name: Afar (Eritrea) +display locale: ID: aa_ER, Name: Afar (Eritrea) +format locale: ID: aa_ER, Name: Afar (Eritrea) +default charset: UTF-8 + +OS Locale: aa_ER.utf8@saaho +default locale: ID: aa_ER, Name: Afar (Eritrea) +display locale: ID: aa_ER, Name: Afar (Eritrea) +format locale: ID: aa_ER, Name: Afar (Eritrea) +default charset: UTF-8 + +OS Locale: aa_ER@saaho +default locale: ID: aa_ER, Name: Afar (Eritrea) +display locale: ID: aa_ER, Name: Afar (Eritrea) +format locale: ID: aa_ER, Name: Afar (Eritrea) +default charset: UTF-8 + +OS Locale: aa_ET +default locale: ID: aa_ET, Name: Afar (Ethiopia) +display locale: ID: aa_ET, Name: Afar (Ethiopia) +format locale: ID: aa_ET, Name: Afar (Ethiopia) +default charset: UTF-8 + +OS Locale: aa_ET.utf8 +default locale: ID: aa_ET, Name: Afar (Ethiopia) +display locale: ID: aa_ET, Name: Afar (Ethiopia) +format locale: ID: aa_ET, Name: Afar (Ethiopia) +default charset: UTF-8 + +OS Locale: af_ZA +default locale: ID: af_ZA, Name: Afrikaans (South Africa) +display locale: ID: af_ZA, Name: Afrikaans (South Africa) +format locale: ID: af_ZA, Name: Afrikaans (South Africa) +default charset: ISO-8859-1 + +OS Locale: af_ZA.iso88591 +default locale: ID: af_ZA, Name: Afrikaans (South Africa) +display locale: ID: af_ZA, Name: Afrikaans (South Africa) +format locale: ID: af_ZA, Name: Afrikaans (South Africa) +default charset: ISO-8859-1 + +OS Locale: af_ZA.utf8 +default locale: ID: af_ZA, Name: Afrikaans (South Africa) +display locale: ID: af_ZA, Name: Afrikaans (South Africa) +format locale: ID: af_ZA, Name: Afrikaans (South Africa) +default charset: UTF-8 + +OS Locale: am_ET +default locale: ID: am_ET, Name: Amharic (Ethiopia) +display locale: ID: am_ET, Name: Amharic (Ethiopia) +format locale: ID: am_ET, Name: Amharic (Ethiopia) +default charset: UTF-8 + +OS Locale: am_ET.utf8 +default locale: ID: am_ET, Name: Amharic (Ethiopia) +display locale: ID: am_ET, Name: Amharic (Ethiopia) +format locale: ID: am_ET, Name: Amharic (Ethiopia) +default charset: UTF-8 + +OS Locale: an_ES +default locale: ID: an_ES, Name: Aragonese (Spain) +display locale: ID: an_ES, Name: Aragonese (Spain) +format locale: ID: an_ES, Name: Aragonese (Spain) +default charset: ISO-8859-15 + +OS Locale: an_ES.iso885915 +default locale: ID: an_ES, Name: Aragonese (Spain) +display locale: ID: an_ES, Name: Aragonese (Spain) +format locale: ID: an_ES, Name: Aragonese (Spain) +default charset: ISO-8859-15 + +OS Locale: an_ES.utf8 +default locale: ID: an_ES, Name: Aragonese (Spain) +display locale: ID: an_ES, Name: Aragonese (Spain) +format locale: ID: an_ES, Name: Aragonese (Spain) +default charset: UTF-8 + +OS Locale: ar_AE +default locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +display locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +format locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +default charset: ISO-8859-6 + +OS Locale: ar_AE.iso88596 +default locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +display locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +format locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +default charset: ISO-8859-6 + +OS Locale: ar_AE.utf8 +default locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +display locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +format locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +default charset: UTF-8 + +OS Locale: ar_BH +default locale: ID: ar_BH, Name: Arabic (Bahrain) +display locale: ID: ar_BH, Name: Arabic (Bahrain) +format locale: ID: ar_BH, Name: Arabic (Bahrain) +default charset: ISO-8859-6 + +OS Locale: ar_BH.iso88596 +default locale: ID: ar_BH, Name: Arabic (Bahrain) +display locale: ID: ar_BH, Name: Arabic (Bahrain) +format locale: ID: ar_BH, Name: Arabic (Bahrain) +default charset: ISO-8859-6 + +OS Locale: ar_BH.utf8 +default locale: ID: ar_BH, Name: Arabic (Bahrain) +display locale: ID: ar_BH, Name: Arabic (Bahrain) +format locale: ID: ar_BH, Name: Arabic (Bahrain) +default charset: UTF-8 + +OS Locale: ar_DZ +default locale: ID: ar_DZ, Name: Arabic (Algeria) +display locale: ID: ar_DZ, Name: Arabic (Algeria) +format locale: ID: ar_DZ, Name: Arabic (Algeria) +default charset: ISO-8859-6 + +OS Locale: ar_DZ.iso88596 +default locale: ID: ar_DZ, Name: Arabic (Algeria) +display locale: ID: ar_DZ, Name: Arabic (Algeria) +format locale: ID: ar_DZ, Name: Arabic (Algeria) +default charset: ISO-8859-6 + +OS Locale: ar_DZ.utf8 +default locale: ID: ar_DZ, Name: Arabic (Algeria) +display locale: ID: ar_DZ, Name: Arabic (Algeria) +format locale: ID: ar_DZ, Name: Arabic (Algeria) +default charset: UTF-8 + +OS Locale: ar_EG +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: ISO-8859-6 + +OS Locale: ar_EG.iso88596 +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: ISO-8859-6 + +OS Locale: ar_EG.utf8 +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: UTF-8 + +OS Locale: ar_IN +default locale: ID: ar_IN, Name: Arabic (India) +display locale: ID: ar_IN, Name: Arabic (India) +format locale: ID: ar_IN, Name: Arabic (India) +default charset: UTF-8 + +OS Locale: ar_IN.utf8 +default locale: ID: ar_IN, Name: Arabic (India) +display locale: ID: ar_IN, Name: Arabic (India) +format locale: ID: ar_IN, Name: Arabic (India) +default charset: UTF-8 + +OS Locale: ar_IQ +default locale: ID: ar_IQ, Name: Arabic (Iraq) +display locale: ID: ar_IQ, Name: Arabic (Iraq) +format locale: ID: ar_IQ, Name: Arabic (Iraq) +default charset: ISO-8859-6 + +OS Locale: ar_IQ.iso88596 +default locale: ID: ar_IQ, Name: Arabic (Iraq) +display locale: ID: ar_IQ, Name: Arabic (Iraq) +format locale: ID: ar_IQ, Name: Arabic (Iraq) +default charset: ISO-8859-6 + +OS Locale: ar_IQ.utf8 +default locale: ID: ar_IQ, Name: Arabic (Iraq) +display locale: ID: ar_IQ, Name: Arabic (Iraq) +format locale: ID: ar_IQ, Name: Arabic (Iraq) +default charset: UTF-8 + +OS Locale: ar_JO +default locale: ID: ar_JO, Name: Arabic (Jordan) +display locale: ID: ar_JO, Name: Arabic (Jordan) +format locale: ID: ar_JO, Name: Arabic (Jordan) +default charset: ISO-8859-6 + +OS Locale: ar_JO.iso88596 +default locale: ID: ar_JO, Name: Arabic (Jordan) +display locale: ID: ar_JO, Name: Arabic (Jordan) +format locale: ID: ar_JO, Name: Arabic (Jordan) +default charset: ISO-8859-6 + +OS Locale: ar_JO.utf8 +default locale: ID: ar_JO, Name: Arabic (Jordan) +display locale: ID: ar_JO, Name: Arabic (Jordan) +format locale: ID: ar_JO, Name: Arabic (Jordan) +default charset: UTF-8 + +OS Locale: ar_KW +default locale: ID: ar_KW, Name: Arabic (Kuwait) +display locale: ID: ar_KW, Name: Arabic (Kuwait) +format locale: ID: ar_KW, Name: Arabic (Kuwait) +default charset: ISO-8859-6 + +OS Locale: ar_KW.iso88596 +default locale: ID: ar_KW, Name: Arabic (Kuwait) +display locale: ID: ar_KW, Name: Arabic (Kuwait) +format locale: ID: ar_KW, Name: Arabic (Kuwait) +default charset: ISO-8859-6 + +OS Locale: ar_KW.utf8 +default locale: ID: ar_KW, Name: Arabic (Kuwait) +display locale: ID: ar_KW, Name: Arabic (Kuwait) +format locale: ID: ar_KW, Name: Arabic (Kuwait) +default charset: UTF-8 + +OS Locale: ar_LB +default locale: ID: ar_LB, Name: Arabic (Lebanon) +display locale: ID: ar_LB, Name: Arabic (Lebanon) +format locale: ID: ar_LB, Name: Arabic (Lebanon) +default charset: ISO-8859-6 + +OS Locale: ar_LB.iso88596 +default locale: ID: ar_LB, Name: Arabic (Lebanon) +display locale: ID: ar_LB, Name: Arabic (Lebanon) +format locale: ID: ar_LB, Name: Arabic (Lebanon) +default charset: ISO-8859-6 + +OS Locale: ar_LB.utf8 +default locale: ID: ar_LB, Name: Arabic (Lebanon) +display locale: ID: ar_LB, Name: Arabic (Lebanon) +format locale: ID: ar_LB, Name: Arabic (Lebanon) +default charset: UTF-8 + +OS Locale: ar_LY +default locale: ID: ar_LY, Name: Arabic (Libya) +display locale: ID: ar_LY, Name: Arabic (Libya) +format locale: ID: ar_LY, Name: Arabic (Libya) +default charset: ISO-8859-6 + +OS Locale: ar_LY.iso88596 +default locale: ID: ar_LY, Name: Arabic (Libya) +display locale: ID: ar_LY, Name: Arabic (Libya) +format locale: ID: ar_LY, Name: Arabic (Libya) +default charset: ISO-8859-6 + +OS Locale: ar_LY.utf8 +default locale: ID: ar_LY, Name: Arabic (Libya) +display locale: ID: ar_LY, Name: Arabic (Libya) +format locale: ID: ar_LY, Name: Arabic (Libya) +default charset: UTF-8 + +OS Locale: ar_MA +default locale: ID: ar_MA, Name: Arabic (Morocco) +display locale: ID: ar_MA, Name: Arabic (Morocco) +format locale: ID: ar_MA, Name: Arabic (Morocco) +default charset: ISO-8859-6 + +OS Locale: ar_MA.iso88596 +default locale: ID: ar_MA, Name: Arabic (Morocco) +display locale: ID: ar_MA, Name: Arabic (Morocco) +format locale: ID: ar_MA, Name: Arabic (Morocco) +default charset: ISO-8859-6 + +OS Locale: ar_MA.utf8 +default locale: ID: ar_MA, Name: Arabic (Morocco) +display locale: ID: ar_MA, Name: Arabic (Morocco) +format locale: ID: ar_MA, Name: Arabic (Morocco) +default charset: UTF-8 + +OS Locale: ar_OM +default locale: ID: ar_OM, Name: Arabic (Oman) +display locale: ID: ar_OM, Name: Arabic (Oman) +format locale: ID: ar_OM, Name: Arabic (Oman) +default charset: ISO-8859-6 + +OS Locale: ar_OM.iso88596 +default locale: ID: ar_OM, Name: Arabic (Oman) +display locale: ID: ar_OM, Name: Arabic (Oman) +format locale: ID: ar_OM, Name: Arabic (Oman) +default charset: ISO-8859-6 + +OS Locale: ar_OM.utf8 +default locale: ID: ar_OM, Name: Arabic (Oman) +display locale: ID: ar_OM, Name: Arabic (Oman) +format locale: ID: ar_OM, Name: Arabic (Oman) +default charset: UTF-8 + +OS Locale: ar_QA +default locale: ID: ar_QA, Name: Arabic (Qatar) +display locale: ID: ar_QA, Name: Arabic (Qatar) +format locale: ID: ar_QA, Name: Arabic (Qatar) +default charset: ISO-8859-6 + +OS Locale: ar_QA.iso88596 +default locale: ID: ar_QA, Name: Arabic (Qatar) +display locale: ID: ar_QA, Name: Arabic (Qatar) +format locale: ID: ar_QA, Name: Arabic (Qatar) +default charset: ISO-8859-6 + +OS Locale: ar_QA.utf8 +default locale: ID: ar_QA, Name: Arabic (Qatar) +display locale: ID: ar_QA, Name: Arabic (Qatar) +format locale: ID: ar_QA, Name: Arabic (Qatar) +default charset: UTF-8 + +OS Locale: ar_SA +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: ISO-8859-6 + +OS Locale: ar_SA.iso88596 +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: ISO-8859-6 + +OS Locale: ar_SA.utf8 +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: UTF-8 + +OS Locale: ar_SD +default locale: ID: ar_SD, Name: Arabic (Sudan) +display locale: ID: ar_SD, Name: Arabic (Sudan) +format locale: ID: ar_SD, Name: Arabic (Sudan) +default charset: ISO-8859-6 + +OS Locale: ar_SD.iso88596 +default locale: ID: ar_SD, Name: Arabic (Sudan) +display locale: ID: ar_SD, Name: Arabic (Sudan) +format locale: ID: ar_SD, Name: Arabic (Sudan) +default charset: ISO-8859-6 + +OS Locale: ar_SD.utf8 +default locale: ID: ar_SD, Name: Arabic (Sudan) +display locale: ID: ar_SD, Name: Arabic (Sudan) +format locale: ID: ar_SD, Name: Arabic (Sudan) +default charset: UTF-8 + +OS Locale: ar_SY +default locale: ID: ar_SY, Name: Arabic (Syria) +display locale: ID: ar_SY, Name: Arabic (Syria) +format locale: ID: ar_SY, Name: Arabic (Syria) +default charset: ISO-8859-6 + +OS Locale: ar_SY.iso88596 +default locale: ID: ar_SY, Name: Arabic (Syria) +display locale: ID: ar_SY, Name: Arabic (Syria) +format locale: ID: ar_SY, Name: Arabic (Syria) +default charset: ISO-8859-6 + +OS Locale: ar_SY.utf8 +default locale: ID: ar_SY, Name: Arabic (Syria) +display locale: ID: ar_SY, Name: Arabic (Syria) +format locale: ID: ar_SY, Name: Arabic (Syria) +default charset: UTF-8 + +OS Locale: ar_TN +default locale: ID: ar_TN, Name: Arabic (Tunisia) +display locale: ID: ar_TN, Name: Arabic (Tunisia) +format locale: ID: ar_TN, Name: Arabic (Tunisia) +default charset: ISO-8859-6 + +OS Locale: ar_TN.iso88596 +default locale: ID: ar_TN, Name: Arabic (Tunisia) +display locale: ID: ar_TN, Name: Arabic (Tunisia) +format locale: ID: ar_TN, Name: Arabic (Tunisia) +default charset: ISO-8859-6 + +OS Locale: ar_TN.utf8 +default locale: ID: ar_TN, Name: Arabic (Tunisia) +display locale: ID: ar_TN, Name: Arabic (Tunisia) +format locale: ID: ar_TN, Name: Arabic (Tunisia) +default charset: UTF-8 + +OS Locale: ar_YE +default locale: ID: ar_YE, Name: Arabic (Yemen) +display locale: ID: ar_YE, Name: Arabic (Yemen) +format locale: ID: ar_YE, Name: Arabic (Yemen) +default charset: ISO-8859-6 + +OS Locale: ar_YE.iso88596 +default locale: ID: ar_YE, Name: Arabic (Yemen) +display locale: ID: ar_YE, Name: Arabic (Yemen) +format locale: ID: ar_YE, Name: Arabic (Yemen) +default charset: ISO-8859-6 + +OS Locale: ar_YE.utf8 +default locale: ID: ar_YE, Name: Arabic (Yemen) +display locale: ID: ar_YE, Name: Arabic (Yemen) +format locale: ID: ar_YE, Name: Arabic (Yemen) +default charset: UTF-8 + +OS Locale: as_IN.utf8 +default locale: ID: as_IN, Name: Assamese (India) +display locale: ID: as_IN, Name: Assamese (India) +format locale: ID: as_IN, Name: Assamese (India) +default charset: UTF-8 + +OS Locale: az_AZ.utf8 +default locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +display locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: UTF-8 + +OS Locale: be_BY +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: windows-1251 + +OS Locale: be_BY.cp1251 +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: windows-1251 + +OS Locale: be_BY.utf8 +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: UTF-8 + +OS Locale: be_BY.utf8@latin +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: UTF-8 + +OS Locale: be_BY@latin +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: be_BY, Name: Belarusian (Belarus) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: UTF-8 + +OS Locale: bg_BG +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: windows-1251 + +OS Locale: bg_BG.cp1251 +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: windows-1251 + +OS Locale: bg_BG.utf8 +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: UTF-8 + +OS Locale: bn_BD +default locale: ID: bn_BD, Name: Bengali (Bangladesh) +display locale: ID: bn_BD, Name: Bengali (Bangladesh) +format locale: ID: bn_BD, Name: Bengali (Bangladesh) +default charset: UTF-8 + +OS Locale: bn_BD.utf8 +default locale: ID: bn_BD, Name: Bengali (Bangladesh) +display locale: ID: bn_BD, Name: Bengali (Bangladesh) +format locale: ID: bn_BD, Name: Bengali (Bangladesh) +default charset: UTF-8 + +OS Locale: bn_IN +default locale: ID: bn_IN, Name: Bengali (India) +display locale: ID: bn_IN, Name: Bengali (India) +format locale: ID: bn_IN, Name: Bengali (India) +default charset: UTF-8 + +OS Locale: bn_IN.utf8 +default locale: ID: bn_IN, Name: Bengali (India) +display locale: ID: bn_IN, Name: Bengali (India) +format locale: ID: bn_IN, Name: Bengali (India) +default charset: UTF-8 + +OS Locale: bokmål +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: bokmal +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: br_FR +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: ISO-8859-1 + +OS Locale: br_FR.iso88591 +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: ISO-8859-1 + +OS Locale: br_FR.iso885915@euro +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: ISO-8859-15 + +OS Locale: br_FR.utf8 +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: UTF-8 + +OS Locale: br_FR@euro +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: br_FR, Name: Breton (France) +format locale: ID: br_FR, Name: Breton (France) +default charset: ISO-8859-15 + +OS Locale: bs_BA +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: ISO-8859-2 + +OS Locale: bs_BA.iso88592 +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: ISO-8859-2 + +OS Locale: bs_BA.utf8 +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: UTF-8 + +OS Locale: byn_ER +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: byn_ER.utf8 +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: ca_AD +default locale: ID: ca_AD, Name: Catalan (Andorra) +display locale: ID: ca_AD, Name: Catalan (Andorra) +format locale: ID: ca_AD, Name: Catalan (Andorra) +default charset: ISO-8859-15 + +OS Locale: ca_AD.iso885915 +default locale: ID: ca_AD, Name: Catalan (Andorra) +display locale: ID: ca_AD, Name: Catalan (Andorra) +format locale: ID: ca_AD, Name: Catalan (Andorra) +default charset: ISO-8859-15 + +OS Locale: ca_AD.utf8 +default locale: ID: ca_AD, Name: Catalan (Andorra) +display locale: ID: ca_AD, Name: Catalan (Andorra) +format locale: ID: ca_AD, Name: Catalan (Andorra) +default charset: UTF-8 + +OS Locale: ca_ES +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: ca_ES.iso88591 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: ca_ES.iso885915@euro +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-15 + +OS Locale: ca_ES.utf8 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: UTF-8 + +OS Locale: ca_ES@euro +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-15 + +OS Locale: ca_FR +default locale: ID: ca_FR, Name: Catalan (France) +display locale: ID: ca_FR, Name: Catalan (France) +format locale: ID: ca_FR, Name: Catalan (France) +default charset: ISO-8859-15 + +OS Locale: ca_FR.iso885915 +default locale: ID: ca_FR, Name: Catalan (France) +display locale: ID: ca_FR, Name: Catalan (France) +format locale: ID: ca_FR, Name: Catalan (France) +default charset: ISO-8859-15 + +OS Locale: ca_FR.utf8 +default locale: ID: ca_FR, Name: Catalan (France) +display locale: ID: ca_FR, Name: Catalan (France) +format locale: ID: ca_FR, Name: Catalan (France) +default charset: UTF-8 + +OS Locale: ca_IT +default locale: ID: ca_IT, Name: Catalan (Italy) +display locale: ID: ca_IT, Name: Catalan (Italy) +format locale: ID: ca_IT, Name: Catalan (Italy) +default charset: ISO-8859-15 + +OS Locale: ca_IT.iso885915 +default locale: ID: ca_IT, Name: Catalan (Italy) +display locale: ID: ca_IT, Name: Catalan (Italy) +format locale: ID: ca_IT, Name: Catalan (Italy) +default charset: ISO-8859-15 + +OS Locale: ca_IT.utf8 +default locale: ID: ca_IT, Name: Catalan (Italy) +display locale: ID: ca_IT, Name: Catalan (Italy) +format locale: ID: ca_IT, Name: Catalan (Italy) +default charset: UTF-8 + +OS Locale: catalan +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: croatian +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: cs_CZ +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: cs_CZ.iso88592 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: cs_CZ.utf8 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: UTF-8 + +OS Locale: csb_PL +default locale: ID: en_PL, Name: English (Poland) +display locale: ID: en_PL, Name: English (Poland) +format locale: ID: en_PL, Name: English (Poland) +default charset: UTF-8 + +OS Locale: csb_PL.utf8 +default locale: ID: en_PL, Name: English (Poland) +display locale: ID: en_PL, Name: English (Poland) +format locale: ID: en_PL, Name: English (Poland) +default charset: UTF-8 + +OS Locale: cy_GB +default locale: ID: cy_GB, Name: Welsh (United Kingdom) +display locale: ID: cy_GB, Name: Welsh (United Kingdom) +format locale: ID: cy_GB, Name: Welsh (United Kingdom) +default charset: UTF-8 + +OS Locale: cy_GB.iso885914 +default locale: ID: cy_GB, Name: Welsh (United Kingdom) +display locale: ID: cy_GB, Name: Welsh (United Kingdom) +format locale: ID: cy_GB, Name: Welsh (United Kingdom) +default charset: UTF-8 + +OS Locale: cy_GB.utf8 +default locale: ID: cy_GB, Name: Welsh (United Kingdom) +display locale: ID: cy_GB, Name: Welsh (United Kingdom) +format locale: ID: cy_GB, Name: Welsh (United Kingdom) +default charset: UTF-8 + +OS Locale: czech +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: da_DK +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: da_DK.iso88591 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: da_DK.iso885915 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-15 + +OS Locale: da_DK.utf8 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: UTF-8 + +OS Locale: danish +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: dansk +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: de_AT +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-1 + +OS Locale: de_AT.iso88591 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-1 + +OS Locale: de_AT.iso885915@euro +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-15 + +OS Locale: de_AT.utf8 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: UTF-8 + +OS Locale: de_AT@euro +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-15 + +OS Locale: de_BE +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: ISO-8859-1 + +OS Locale: de_BE.iso88591 +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: ISO-8859-1 + +OS Locale: de_BE.iso885915@euro +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: ISO-8859-15 + +OS Locale: de_BE.utf8 +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: UTF-8 + +OS Locale: de_BE@euro +default locale: ID: de_BE, Name: German (Belgium) +display locale: ID: de_BE, Name: German (Belgium) +format locale: ID: de_BE, Name: German (Belgium) +default charset: ISO-8859-15 + +OS Locale: de_CH +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: ISO-8859-1 + +OS Locale: de_CH.iso88591 +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: ISO-8859-1 + +OS Locale: de_CH.utf8 +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: UTF-8 + +OS Locale: de_DE +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: de_DE.iso88591 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: de_DE.iso885915@euro +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 + +OS Locale: de_DE.utf8 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: UTF-8 + +OS Locale: de_DE@euro +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 + +OS Locale: de_LU +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: ISO-8859-1 + +OS Locale: de_LU.iso88591 +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: ISO-8859-1 + +OS Locale: de_LU.iso885915@euro +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: ISO-8859-15 + +OS Locale: de_LU.utf8 +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: UTF-8 + +OS Locale: de_LU@euro +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: de_LU, Name: German (Luxembourg) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: ISO-8859-15 + +OS Locale: deutsch +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: dutch +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: dz_BT +default locale: ID: dz_BT, Name: Dzongkha (Bhutan) +display locale: ID: dz_BT, Name: Dzongkha (Bhutan) +format locale: ID: dz_BT, Name: Dzongkha (Bhutan) +default charset: UTF-8 + +OS Locale: dz_BT.utf8 +default locale: ID: dz_BT, Name: Dzongkha (Bhutan) +display locale: ID: dz_BT, Name: Dzongkha (Bhutan) +format locale: ID: dz_BT, Name: Dzongkha (Bhutan) +default charset: UTF-8 + +OS Locale: eesti +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: el_CY +default locale: ID: el_CY, Name: Greek (Cyprus) +display locale: ID: el_CY, Name: Greek (Cyprus) +format locale: ID: el_CY, Name: Greek (Cyprus) +default charset: ISO-8859-7 + +OS Locale: el_CY.iso88597 +default locale: ID: el_CY, Name: Greek (Cyprus) +display locale: ID: el_CY, Name: Greek (Cyprus) +format locale: ID: el_CY, Name: Greek (Cyprus) +default charset: ISO-8859-7 + +OS Locale: el_CY.utf8 +default locale: ID: el_CY, Name: Greek (Cyprus) +display locale: ID: el_CY, Name: Greek (Cyprus) +format locale: ID: el_CY, Name: Greek (Cyprus) +default charset: UTF-8 + +OS Locale: el_GR +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: el_GR.iso88597 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: el_GR.utf8 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: UTF-8 + +OS Locale: en_AU +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: ISO-8859-1 + +OS Locale: en_AU.iso88591 +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: ISO-8859-1 + +OS Locale: en_AU.utf8 +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: UTF-8 + +OS Locale: en_BW +default locale: ID: en_BW, Name: English (Botswana) +display locale: ID: en_BW, Name: English (Botswana) +format locale: ID: en_BW, Name: English (Botswana) +default charset: ISO-8859-1 + +OS Locale: en_BW.iso88591 +default locale: ID: en_BW, Name: English (Botswana) +display locale: ID: en_BW, Name: English (Botswana) +format locale: ID: en_BW, Name: English (Botswana) +default charset: ISO-8859-1 + +OS Locale: en_BW.utf8 +default locale: ID: en_BW, Name: English (Botswana) +display locale: ID: en_BW, Name: English (Botswana) +format locale: ID: en_BW, Name: English (Botswana) +default charset: UTF-8 + +OS Locale: en_CA +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: ISO-8859-1 + +OS Locale: en_CA.iso88591 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: ISO-8859-1 + +OS Locale: en_CA.utf8 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: UTF-8 + +OS Locale: en_DK +default locale: ID: en_DK, Name: English (Denmark) +display locale: ID: en_DK, Name: English (Denmark) +format locale: ID: en_DK, Name: English (Denmark) +default charset: ISO-8859-1 + +OS Locale: en_DK.iso88591 +default locale: ID: en_DK, Name: English (Denmark) +display locale: ID: en_DK, Name: English (Denmark) +format locale: ID: en_DK, Name: English (Denmark) +default charset: ISO-8859-1 + +OS Locale: en_DK.utf8 +default locale: ID: en_DK, Name: English (Denmark) +display locale: ID: en_DK, Name: English (Denmark) +format locale: ID: en_DK, Name: English (Denmark) +default charset: UTF-8 + +OS Locale: en_GB +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: en_GB.iso88591 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: en_GB.iso885915 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-15 + +OS Locale: en_GB.utf8 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: UTF-8 + +OS Locale: en_HK +default locale: ID: en_HK, Name: English (Hong Kong) +display locale: ID: en_HK, Name: English (Hong Kong) +format locale: ID: en_HK, Name: English (Hong Kong) +default charset: ISO-8859-1 + +OS Locale: en_HK.iso88591 +default locale: ID: en_HK, Name: English (Hong Kong) +display locale: ID: en_HK, Name: English (Hong Kong) +format locale: ID: en_HK, Name: English (Hong Kong) +default charset: ISO-8859-1 + +OS Locale: en_HK.utf8 +default locale: ID: en_HK, Name: English (Hong Kong) +display locale: ID: en_HK, Name: English (Hong Kong) +format locale: ID: en_HK, Name: English (Hong Kong) +default charset: UTF-8 + +OS Locale: en_IE +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-1 + +OS Locale: en_IE.iso88591 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-1 + +OS Locale: en_IE.iso885915@euro +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-15 + +OS Locale: en_IE.utf8 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: UTF-8 + +OS Locale: en_IE@euro +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-15 + +OS Locale: en_IN +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: UTF-8 + +OS Locale: en_IN.utf8 +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: UTF-8 + +OS Locale: en_NZ +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: ISO-8859-1 + +OS Locale: en_NZ.iso88591 +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: ISO-8859-1 + +OS Locale: en_NZ.utf8 +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: UTF-8 + +OS Locale: en_PH +default locale: ID: en_PH, Name: English (Philippines) +display locale: ID: en_PH, Name: English (Philippines) +format locale: ID: en_PH, Name: English (Philippines) +default charset: ISO-8859-1 + +OS Locale: en_PH.iso88591 +default locale: ID: en_PH, Name: English (Philippines) +display locale: ID: en_PH, Name: English (Philippines) +format locale: ID: en_PH, Name: English (Philippines) +default charset: ISO-8859-1 + +OS Locale: en_PH.utf8 +default locale: ID: en_PH, Name: English (Philippines) +display locale: ID: en_PH, Name: English (Philippines) +format locale: ID: en_PH, Name: English (Philippines) +default charset: UTF-8 + +OS Locale: en_SG +default locale: ID: en_SG, Name: English (Singapore) +display locale: ID: en_SG, Name: English (Singapore) +format locale: ID: en_SG, Name: English (Singapore) +default charset: ISO-8859-1 + +OS Locale: en_SG.iso88591 +default locale: ID: en_SG, Name: English (Singapore) +display locale: ID: en_SG, Name: English (Singapore) +format locale: ID: en_SG, Name: English (Singapore) +default charset: ISO-8859-1 + +OS Locale: en_SG.utf8 +default locale: ID: en_SG, Name: English (Singapore) +display locale: ID: en_SG, Name: English (Singapore) +format locale: ID: en_SG, Name: English (Singapore) +default charset: UTF-8 + +OS Locale: en_US +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-1 + +OS Locale: en_US.iso88591 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-1 + +OS Locale: en_US.iso885915 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-15 + +OS Locale: en_US.utf8 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: UTF-8 + +OS Locale: en_ZA +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: ISO-8859-1 + +OS Locale: en_ZA.iso88591 +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: ISO-8859-1 + +OS Locale: en_ZA.utf8 +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: UTF-8 + +OS Locale: en_ZW +default locale: ID: en_ZW, Name: English (Zimbabwe) +display locale: ID: en_ZW, Name: English (Zimbabwe) +format locale: ID: en_ZW, Name: English (Zimbabwe) +default charset: ISO-8859-1 + +OS Locale: en_ZW.iso88591 +default locale: ID: en_ZW, Name: English (Zimbabwe) +display locale: ID: en_ZW, Name: English (Zimbabwe) +format locale: ID: en_ZW, Name: English (Zimbabwe) +default charset: ISO-8859-1 + +OS Locale: en_ZW.utf8 +default locale: ID: en_ZW, Name: English (Zimbabwe) +display locale: ID: en_ZW, Name: English (Zimbabwe) +format locale: ID: en_ZW, Name: English (Zimbabwe) +default charset: UTF-8 + +OS Locale: es_AR +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: ISO-8859-1 + +OS Locale: es_AR.iso88591 +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: ISO-8859-1 + +OS Locale: es_AR.utf8 +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: UTF-8 + +OS Locale: es_BO +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: ISO-8859-1 + +OS Locale: es_BO.iso88591 +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: ISO-8859-1 + +OS Locale: es_BO.utf8 +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: UTF-8 + +OS Locale: es_CL +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: ISO-8859-1 + +OS Locale: es_CL.iso88591 +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: ISO-8859-1 + +OS Locale: es_CL.utf8 +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: UTF-8 + +OS Locale: es_CO +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: ISO-8859-1 + +OS Locale: es_CO.iso88591 +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: ISO-8859-1 + +OS Locale: es_CO.utf8 +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: UTF-8 + +OS Locale: es_CR +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: ISO-8859-1 + +OS Locale: es_CR.iso88591 +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: ISO-8859-1 + +OS Locale: es_CR.utf8 +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: UTF-8 + +OS Locale: es_DO +default locale: ID: es_DO, Name: Spanish (Dominican Republic) +display locale: ID: es_DO, Name: Spanish (Dominican Republic) +format locale: ID: es_DO, Name: Spanish (Dominican Republic) +default charset: ISO-8859-1 + +OS Locale: es_DO.iso88591 +default locale: ID: es_DO, Name: Spanish (Dominican Republic) +display locale: ID: es_DO, Name: Spanish (Dominican Republic) +format locale: ID: es_DO, Name: Spanish (Dominican Republic) +default charset: ISO-8859-1 + +OS Locale: es_DO.utf8 +default locale: ID: es_DO, Name: Spanish (Dominican Republic) +display locale: ID: es_DO, Name: Spanish (Dominican Republic) +format locale: ID: es_DO, Name: Spanish (Dominican Republic) +default charset: UTF-8 + +OS Locale: es_EC +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: ISO-8859-1 + +OS Locale: es_EC.iso88591 +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: ISO-8859-1 + +OS Locale: es_EC.utf8 +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: UTF-8 + +OS Locale: es_ES +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: es_ES.iso88591 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: es_ES.iso885915@euro +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 + +OS Locale: es_ES.utf8 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: UTF-8 + +OS Locale: es_ES@euro +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 + +OS Locale: es_GT +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: ISO-8859-1 + +OS Locale: es_GT.iso88591 +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: ISO-8859-1 + +OS Locale: es_GT.utf8 +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: UTF-8 + +OS Locale: es_HN +default locale: ID: es_HN, Name: Spanish (Honduras) +display locale: ID: es_HN, Name: Spanish (Honduras) +format locale: ID: es_HN, Name: Spanish (Honduras) +default charset: ISO-8859-1 + +OS Locale: es_HN.iso88591 +default locale: ID: es_HN, Name: Spanish (Honduras) +display locale: ID: es_HN, Name: Spanish (Honduras) +format locale: ID: es_HN, Name: Spanish (Honduras) +default charset: ISO-8859-1 + +OS Locale: es_HN.utf8 +default locale: ID: es_HN, Name: Spanish (Honduras) +display locale: ID: es_HN, Name: Spanish (Honduras) +format locale: ID: es_HN, Name: Spanish (Honduras) +default charset: UTF-8 + +OS Locale: es_MX +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: ISO-8859-1 + +OS Locale: es_MX.iso88591 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: ISO-8859-1 + +OS Locale: es_MX.utf8 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: UTF-8 + +OS Locale: es_NI +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: ISO-8859-1 + +OS Locale: es_NI.iso88591 +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: ISO-8859-1 + +OS Locale: es_NI.utf8 +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: UTF-8 + +OS Locale: es_PA +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: ISO-8859-1 + +OS Locale: es_PA.iso88591 +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: ISO-8859-1 + +OS Locale: es_PA.utf8 +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: UTF-8 + +OS Locale: es_PE +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: ISO-8859-1 + +OS Locale: es_PE.iso88591 +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: ISO-8859-1 + +OS Locale: es_PE.utf8 +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: UTF-8 + +OS Locale: es_PR +default locale: ID: es_PR, Name: Spanish (Puerto Rico) +display locale: ID: es_PR, Name: Spanish (Puerto Rico) +format locale: ID: es_PR, Name: Spanish (Puerto Rico) +default charset: ISO-8859-1 + +OS Locale: es_PR.iso88591 +default locale: ID: es_PR, Name: Spanish (Puerto Rico) +display locale: ID: es_PR, Name: Spanish (Puerto Rico) +format locale: ID: es_PR, Name: Spanish (Puerto Rico) +default charset: ISO-8859-1 + +OS Locale: es_PR.utf8 +default locale: ID: es_PR, Name: Spanish (Puerto Rico) +display locale: ID: es_PR, Name: Spanish (Puerto Rico) +format locale: ID: es_PR, Name: Spanish (Puerto Rico) +default charset: UTF-8 + +OS Locale: es_PY +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: ISO-8859-1 + +OS Locale: es_PY.iso88591 +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: ISO-8859-1 + +OS Locale: es_PY.utf8 +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: UTF-8 + +OS Locale: es_SV +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: ISO-8859-1 + +OS Locale: es_SV.iso88591 +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: ISO-8859-1 + +OS Locale: es_SV.utf8 +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: UTF-8 + +OS Locale: es_US +default locale: ID: es_US, Name: Spanish (United States) +display locale: ID: es_US, Name: Spanish (United States) +format locale: ID: es_US, Name: Spanish (United States) +default charset: ISO-8859-1 + +OS Locale: es_US.iso88591 +default locale: ID: es_US, Name: Spanish (United States) +display locale: ID: es_US, Name: Spanish (United States) +format locale: ID: es_US, Name: Spanish (United States) +default charset: ISO-8859-1 + +OS Locale: es_US.utf8 +default locale: ID: es_US, Name: Spanish (United States) +display locale: ID: es_US, Name: Spanish (United States) +format locale: ID: es_US, Name: Spanish (United States) +default charset: UTF-8 + +OS Locale: es_UY +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: ISO-8859-1 + +OS Locale: es_UY.iso88591 +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: ISO-8859-1 + +OS Locale: es_UY.utf8 +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: UTF-8 + +OS Locale: es_VE +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: ISO-8859-1 + +OS Locale: es_VE.iso88591 +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: ISO-8859-1 + +OS Locale: es_VE.utf8 +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: UTF-8 + +OS Locale: estonian +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: et_EE +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-1 + +OS Locale: et_EE.iso88591 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-1 + +OS Locale: et_EE.iso885915 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-15 + +OS Locale: et_EE.utf8 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: UTF-8 + +OS Locale: eu_ES +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: ISO-8859-1 + +OS Locale: eu_ES.iso88591 +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: ISO-8859-1 + +OS Locale: eu_ES.iso885915@euro +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: ISO-8859-15 + +OS Locale: eu_ES.utf8 +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: UTF-8 + +OS Locale: eu_ES@euro +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: eu_ES, Name: Basque (Spain) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: ISO-8859-15 + +OS Locale: fa_IR +default locale: ID: fa_IR, Name: Persian (Iran) +display locale: ID: fa_IR, Name: Persian (Iran) +format locale: ID: fa_IR, Name: Persian (Iran) +default charset: UTF-8 + +OS Locale: fa_IR.utf8 +default locale: ID: fa_IR, Name: Persian (Iran) +display locale: ID: fa_IR, Name: Persian (Iran) +format locale: ID: fa_IR, Name: Persian (Iran) +default charset: UTF-8 + +OS Locale: fi_FI +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fi_FI.iso88591 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fi_FI.iso885915@euro +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 + +OS Locale: fi_FI.utf8 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: UTF-8 + +OS Locale: fi_FI@euro +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 + +OS Locale: finnish +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fo_FO +default locale: ID: fo_FO, Name: Faroese (Faroe Islands) +display locale: ID: fo_FO, Name: Faroese (Faroe Islands) +format locale: ID: fo_FO, Name: Faroese (Faroe Islands) +default charset: ISO-8859-1 + +OS Locale: fo_FO.iso88591 +default locale: ID: fo_FO, Name: Faroese (Faroe Islands) +display locale: ID: fo_FO, Name: Faroese (Faroe Islands) +format locale: ID: fo_FO, Name: Faroese (Faroe Islands) +default charset: ISO-8859-1 + +OS Locale: fo_FO.utf8 +default locale: ID: fo_FO, Name: Faroese (Faroe Islands) +display locale: ID: fo_FO, Name: Faroese (Faroe Islands) +format locale: ID: fo_FO, Name: Faroese (Faroe Islands) +default charset: UTF-8 + +OS Locale: fr_BE +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-1 + +OS Locale: fr_BE.iso88591 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-1 + +OS Locale: fr_BE.iso885915@euro +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-15 + +OS Locale: fr_BE.utf8 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: UTF-8 + +OS Locale: fr_BE@euro +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-15 + +OS Locale: fr_CA +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: ISO-8859-1 + +OS Locale: fr_CA.iso88591 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: ISO-8859-1 + +OS Locale: fr_CA.utf8 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: UTF-8 + +OS Locale: fr_CH +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: ISO-8859-1 + +OS Locale: fr_CH.iso88591 +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: ISO-8859-1 + +OS Locale: fr_CH.utf8 +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: UTF-8 + +OS Locale: fr_FR +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fr_FR.iso88591 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fr_FR.iso885915@euro +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 + +OS Locale: fr_FR.utf8 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: UTF-8 + +OS Locale: fr_FR@euro +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 + +OS Locale: fr_LU +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: ISO-8859-1 + +OS Locale: fr_LU.iso88591 +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: ISO-8859-1 + +OS Locale: fr_LU.iso885915@euro +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: ISO-8859-15 + +OS Locale: fr_LU.utf8 +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: UTF-8 + +OS Locale: fr_LU@euro +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: fr_LU, Name: French (Luxembourg) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: ISO-8859-15 + +OS Locale: français +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: french +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fy_NL +default locale: ID: fy_NL, Name: Frisian (Netherlands) +display locale: ID: fy_NL, Name: Frisian (Netherlands) +format locale: ID: fy_NL, Name: Frisian (Netherlands) +default charset: UTF-8 + +OS Locale: fy_NL.utf8 +default locale: ID: fy_NL, Name: Frisian (Netherlands) +display locale: ID: fy_NL, Name: Frisian (Netherlands) +format locale: ID: fy_NL, Name: Frisian (Netherlands) +default charset: UTF-8 + +OS Locale: ga_IE +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: ISO-8859-1 + +OS Locale: ga_IE.iso88591 +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: ISO-8859-1 + +OS Locale: ga_IE.iso885915@euro +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: ISO-8859-15 + +OS Locale: ga_IE.utf8 +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: UTF-8 + +OS Locale: ga_IE@euro +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: ga_IE, Name: Irish (Ireland) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: ISO-8859-15 + +OS Locale: galego +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: galician +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: gd_GB +default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +default charset: ISO-8859-15 + +OS Locale: gd_GB.iso885915 +default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +default charset: ISO-8859-15 + +OS Locale: gd_GB.utf8 +default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +display locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +default charset: UTF-8 + +OS Locale: german +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: gez_ER +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: gez_ER.utf8 +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: gez_ER.utf8@abegede +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: gez_ER@abegede +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: gez_ET +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: gez_ET.utf8 +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: gez_ET.utf8@abegede +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: gez_ET@abegede +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: gl_ES +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: ISO-8859-1 + +OS Locale: gl_ES.iso88591 +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: ISO-8859-1 + +OS Locale: gl_ES.iso885915@euro +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: ISO-8859-15 + +OS Locale: gl_ES.utf8 +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: UTF-8 + +OS Locale: gl_ES@euro +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: gl_ES, Name: Gallegan (Spain) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: ISO-8859-15 + +OS Locale: greek +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: gu_IN +default locale: ID: gu_IN, Name: Gujarati (India) +display locale: ID: gu_IN, Name: Gujarati (India) +format locale: ID: gu_IN, Name: Gujarati (India) +default charset: UTF-8 + +OS Locale: gu_IN.utf8 +default locale: ID: gu_IN, Name: Gujarati (India) +display locale: ID: gu_IN, Name: Gujarati (India) +format locale: ID: gu_IN, Name: Gujarati (India) +default charset: UTF-8 + +OS Locale: gv_GB +default locale: ID: gv_GB, Name: Manx (United Kingdom) +display locale: ID: gv_GB, Name: Manx (United Kingdom) +format locale: ID: gv_GB, Name: Manx (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: gv_GB.iso88591 +default locale: ID: gv_GB, Name: Manx (United Kingdom) +display locale: ID: gv_GB, Name: Manx (United Kingdom) +format locale: ID: gv_GB, Name: Manx (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: gv_GB.utf8 +default locale: ID: gv_GB, Name: Manx (United Kingdom) +display locale: ID: gv_GB, Name: Manx (United Kingdom) +format locale: ID: gv_GB, Name: Manx (United Kingdom) +default charset: UTF-8 + +OS Locale: he_IL +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: he_IL.iso88598 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: he_IL.utf8 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: UTF-8 + +OS Locale: hebrew +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: hi_IN +default locale: ID: hi_IN, Name: Hindi (India) +display locale: ID: hi_IN, Name: Hindi (India) +format locale: ID: hi_IN, Name: Hindi (India) +default charset: UTF-8 + +OS Locale: hi_IN.utf8 +default locale: ID: hi_IN, Name: Hindi (India) +display locale: ID: hi_IN, Name: Hindi (India) +format locale: ID: hi_IN, Name: Hindi (India) +default charset: UTF-8 + +OS Locale: hr_HR +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: hr_HR.iso88592 +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: hr_HR.utf8 +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: UTF-8 + +OS Locale: hrvatski +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: hsb_DE +default locale: ID: en_DE, Name: English (Germany) +display locale: ID: en_DE, Name: English (Germany) +format locale: ID: en_DE, Name: English (Germany) +default charset: ISO-8859-2 + +OS Locale: hsb_DE.iso88592 +default locale: ID: en_DE, Name: English (Germany) +display locale: ID: en_DE, Name: English (Germany) +format locale: ID: en_DE, Name: English (Germany) +default charset: ISO-8859-2 + +OS Locale: hsb_DE.utf8 +default locale: ID: en_DE, Name: English (Germany) +display locale: ID: en_DE, Name: English (Germany) +format locale: ID: en_DE, Name: English (Germany) +default charset: UTF-8 + +OS Locale: hu_HU +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hu_HU.iso88592 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hu_HU.utf8 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: UTF-8 + +OS Locale: hungarian +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hy_AM +default locale: ID: hy_AM, Name: Armenian (Armenia) +display locale: ID: hy_AM, Name: Armenian (Armenia) +format locale: ID: hy_AM, Name: Armenian (Armenia) +default charset: UTF-8 + +OS Locale: hy_AM.armscii8 +default locale: ID: hy_AM, Name: Armenian (Armenia) +display locale: ID: hy_AM, Name: Armenian (Armenia) +format locale: ID: hy_AM, Name: Armenian (Armenia) +default charset: UTF-8 + +OS Locale: hy_AM.utf8 +default locale: ID: hy_AM, Name: Armenian (Armenia) +display locale: ID: hy_AM, Name: Armenian (Armenia) +format locale: ID: hy_AM, Name: Armenian (Armenia) +default charset: UTF-8 + +OS Locale: icelandic +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 + +OS Locale: id_ID +default locale: ID: in_ID, Name: Indonesian (Indonesia) +display locale: ID: in_ID, Name: Indonesian (Indonesia) +format locale: ID: in_ID, Name: Indonesian (Indonesia) +default charset: ISO-8859-1 + +OS Locale: id_ID.iso88591 +default locale: ID: in_ID, Name: Indonesian (Indonesia) +display locale: ID: in_ID, Name: Indonesian (Indonesia) +format locale: ID: in_ID, Name: Indonesian (Indonesia) +default charset: ISO-8859-1 + +OS Locale: id_ID.utf8 +default locale: ID: in_ID, Name: Indonesian (Indonesia) +display locale: ID: in_ID, Name: Indonesian (Indonesia) +format locale: ID: in_ID, Name: Indonesian (Indonesia) +default charset: UTF-8 + +OS Locale: is_IS +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 + +OS Locale: is_IS.iso88591 +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 + +OS Locale: is_IS.utf8 +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: UTF-8 + +OS Locale: it_CH +default locale: ID: it_CH, Name: Italian (Switzerland) +display locale: ID: it_CH, Name: Italian (Switzerland) +format locale: ID: it_CH, Name: Italian (Switzerland) +default charset: ISO-8859-1 + +OS Locale: it_CH.iso88591 +default locale: ID: it_CH, Name: Italian (Switzerland) +display locale: ID: it_CH, Name: Italian (Switzerland) +format locale: ID: it_CH, Name: Italian (Switzerland) +default charset: ISO-8859-1 + +OS Locale: it_CH.utf8 +default locale: ID: it_CH, Name: Italian (Switzerland) +display locale: ID: it_CH, Name: Italian (Switzerland) +format locale: ID: it_CH, Name: Italian (Switzerland) +default charset: UTF-8 + +OS Locale: it_IT +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: it_IT.iso88591 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: it_IT.iso885915@euro +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 + +OS Locale: it_IT.utf8 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: UTF-8 + +OS Locale: it_IT@euro +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 + +OS Locale: italian +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: iw_IL +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: iw_IL.iso88598 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: iw_IL.utf8 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: UTF-8 + +OS Locale: ja_JP +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: ja_JP.eucjp +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: ja_JP.ujis +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: ja_JP.utf8 +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: UTF-8 + +OS Locale: japanese +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: japanese.euc +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-euc-jp-linux + +OS Locale: ka_GE +default locale: ID: ka_GE, Name: Georgian (Georgia) +display locale: ID: ka_GE, Name: Georgian (Georgia) +format locale: ID: ka_GE, Name: Georgian (Georgia) +default charset: UTF-8 + +OS Locale: ka_GE.georgianps +default locale: ID: ka_GE, Name: Georgian (Georgia) +display locale: ID: ka_GE, Name: Georgian (Georgia) +format locale: ID: ka_GE, Name: Georgian (Georgia) +default charset: UTF-8 + +OS Locale: ka_GE.utf8 +default locale: ID: ka_GE, Name: Georgian (Georgia) +display locale: ID: ka_GE, Name: Georgian (Georgia) +format locale: ID: ka_GE, Name: Georgian (Georgia) +default charset: UTF-8 + +OS Locale: kk_KZ +default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +default charset: UTF-8 + +OS Locale: kk_KZ.pt154 +default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +default charset: UTF-8 + +OS Locale: kk_KZ.utf8 +default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +display locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +default charset: UTF-8 + +OS Locale: kl_GL +default locale: ID: kl_GL, Name: Greenlandic (Greenland) +display locale: ID: kl_GL, Name: Greenlandic (Greenland) +format locale: ID: kl_GL, Name: Greenlandic (Greenland) +default charset: ISO-8859-1 + +OS Locale: kl_GL.iso88591 +default locale: ID: kl_GL, Name: Greenlandic (Greenland) +display locale: ID: kl_GL, Name: Greenlandic (Greenland) +format locale: ID: kl_GL, Name: Greenlandic (Greenland) +default charset: ISO-8859-1 + +OS Locale: kl_GL.utf8 +default locale: ID: kl_GL, Name: Greenlandic (Greenland) +display locale: ID: kl_GL, Name: Greenlandic (Greenland) +format locale: ID: kl_GL, Name: Greenlandic (Greenland) +default charset: UTF-8 + +OS Locale: km_KH +default locale: ID: km_KH, Name: Khmer (Cambodia) +display locale: ID: km_KH, Name: Khmer (Cambodia) +format locale: ID: km_KH, Name: Khmer (Cambodia) +default charset: UTF-8 + +OS Locale: km_KH.utf8 +default locale: ID: km_KH, Name: Khmer (Cambodia) +display locale: ID: km_KH, Name: Khmer (Cambodia) +format locale: ID: km_KH, Name: Khmer (Cambodia) +default charset: UTF-8 + +OS Locale: kn_IN +default locale: ID: kn_IN, Name: Kannada (India) +display locale: ID: kn_IN, Name: Kannada (India) +format locale: ID: kn_IN, Name: Kannada (India) +default charset: UTF-8 + +OS Locale: kn_IN.utf8 +default locale: ID: kn_IN, Name: Kannada (India) +display locale: ID: kn_IN, Name: Kannada (India) +format locale: ID: kn_IN, Name: Kannada (India) +default charset: UTF-8 + +OS Locale: ko_KR +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR + +OS Locale: ko_KR.euckr +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR + +OS Locale: ko_KR.utf8 +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: UTF-8 + +OS Locale: korean +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: EUC-KR + +OS Locale: korean.euc +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: EUC-KR + +OS Locale: ku_TR +default locale: ID: ku_TR, Name: Kurdish (Turkey) +display locale: ID: ku_TR, Name: Kurdish (Turkey) +format locale: ID: ku_TR, Name: Kurdish (Turkey) +default charset: ISO-8859-9 + +OS Locale: ku_TR.iso88599 +default locale: ID: ku_TR, Name: Kurdish (Turkey) +display locale: ID: ku_TR, Name: Kurdish (Turkey) +format locale: ID: ku_TR, Name: Kurdish (Turkey) +default charset: ISO-8859-9 + +OS Locale: ku_TR.utf8 +default locale: ID: ku_TR, Name: Kurdish (Turkey) +display locale: ID: ku_TR, Name: Kurdish (Turkey) +format locale: ID: ku_TR, Name: Kurdish (Turkey) +default charset: UTF-8 + +OS Locale: kw_GB +default locale: ID: kw_GB, Name: Cornish (United Kingdom) +display locale: ID: kw_GB, Name: Cornish (United Kingdom) +format locale: ID: kw_GB, Name: Cornish (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: kw_GB.iso88591 +default locale: ID: kw_GB, Name: Cornish (United Kingdom) +display locale: ID: kw_GB, Name: Cornish (United Kingdom) +format locale: ID: kw_GB, Name: Cornish (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: kw_GB.utf8 +default locale: ID: kw_GB, Name: Cornish (United Kingdom) +display locale: ID: kw_GB, Name: Cornish (United Kingdom) +format locale: ID: kw_GB, Name: Cornish (United Kingdom) +default charset: UTF-8 + +OS Locale: ky_KG +default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +display locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +default charset: UTF-8 + +OS Locale: ky_KG.utf8 +default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +display locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +default charset: UTF-8 + +OS Locale: lg_UG +default locale: ID: lg_UG, Name: Ganda (Uganda) +display locale: ID: lg_UG, Name: Ganda (Uganda) +format locale: ID: lg_UG, Name: Ganda (Uganda) +default charset: UTF-8 + +OS Locale: lg_UG.iso885910 +default locale: ID: lg_UG, Name: Ganda (Uganda) +display locale: ID: lg_UG, Name: Ganda (Uganda) +format locale: ID: lg_UG, Name: Ganda (Uganda) +default charset: UTF-8 + +OS Locale: lg_UG.utf8 +default locale: ID: lg_UG, Name: Ganda (Uganda) +display locale: ID: lg_UG, Name: Ganda (Uganda) +format locale: ID: lg_UG, Name: Ganda (Uganda) +default charset: UTF-8 + +OS Locale: lithuanian +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-13 + +OS Locale: lo_LA +default locale: ID: lo_LA, Name: Lao (Laos) +display locale: ID: lo_LA, Name: Lao (Laos) +format locale: ID: lo_LA, Name: Lao (Laos) +default charset: UTF-8 + +OS Locale: lo_LA.utf8 +default locale: ID: lo_LA, Name: Lao (Laos) +display locale: ID: lo_LA, Name: Lao (Laos) +format locale: ID: lo_LA, Name: Lao (Laos) +default charset: UTF-8 + +OS Locale: lt_LT +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 + +OS Locale: lt_LT.iso885913 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 + +OS Locale: lt_LT.utf8 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: UTF-8 + +OS Locale: lv_LV +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 + +OS Locale: lv_LV.iso885913 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 + +OS Locale: lv_LV.utf8 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: UTF-8 + +OS Locale: mai_IN +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: UTF-8 + +OS Locale: mai_IN.utf8 +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: UTF-8 + +OS Locale: mg_MG +default locale: ID: mg_MG, Name: Malagasy (Madagascar) +display locale: ID: mg_MG, Name: Malagasy (Madagascar) +format locale: ID: mg_MG, Name: Malagasy (Madagascar) +default charset: ISO-8859-15 + +OS Locale: mg_MG.iso885915 +default locale: ID: mg_MG, Name: Malagasy (Madagascar) +display locale: ID: mg_MG, Name: Malagasy (Madagascar) +format locale: ID: mg_MG, Name: Malagasy (Madagascar) +default charset: ISO-8859-15 + +OS Locale: mg_MG.utf8 +default locale: ID: mg_MG, Name: Malagasy (Madagascar) +display locale: ID: mg_MG, Name: Malagasy (Madagascar) +format locale: ID: mg_MG, Name: Malagasy (Madagascar) +default charset: UTF-8 + +OS Locale: mi_NZ +default locale: ID: mi_NZ, Name: Maori (New Zealand) +display locale: ID: mi_NZ, Name: Maori (New Zealand) +format locale: ID: mi_NZ, Name: Maori (New Zealand) +default charset: ISO-8859-13 + +OS Locale: mi_NZ.iso885913 +default locale: ID: mi_NZ, Name: Maori (New Zealand) +display locale: ID: mi_NZ, Name: Maori (New Zealand) +format locale: ID: mi_NZ, Name: Maori (New Zealand) +default charset: ISO-8859-13 + +OS Locale: mi_NZ.utf8 +default locale: ID: mi_NZ, Name: Maori (New Zealand) +display locale: ID: mi_NZ, Name: Maori (New Zealand) +format locale: ID: mi_NZ, Name: Maori (New Zealand) +default charset: UTF-8 + +OS Locale: mk_MK +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: ISO-8859-5 + +OS Locale: mk_MK.iso88595 +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: ISO-8859-5 + +OS Locale: mk_MK.utf8 +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: UTF-8 + +OS Locale: ml_IN +default locale: ID: ml_IN, Name: Malayalam (India) +display locale: ID: ml_IN, Name: Malayalam (India) +format locale: ID: ml_IN, Name: Malayalam (India) +default charset: UTF-8 + +OS Locale: ml_IN.utf8 +default locale: ID: ml_IN, Name: Malayalam (India) +display locale: ID: ml_IN, Name: Malayalam (India) +format locale: ID: ml_IN, Name: Malayalam (India) +default charset: UTF-8 + +OS Locale: mn_MN +default locale: ID: mn_MN, Name: Mongolian (Mongolia) +display locale: ID: mn_MN, Name: Mongolian (Mongolia) +format locale: ID: mn_MN, Name: Mongolian (Mongolia) +default charset: UTF-8 + +OS Locale: mn_MN.utf8 +default locale: ID: mn_MN, Name: Mongolian (Mongolia) +display locale: ID: mn_MN, Name: Mongolian (Mongolia) +format locale: ID: mn_MN, Name: Mongolian (Mongolia) +default charset: UTF-8 + +OS Locale: mr_IN +default locale: ID: mr_IN, Name: Marathi (India) +display locale: ID: mr_IN, Name: Marathi (India) +format locale: ID: mr_IN, Name: Marathi (India) +default charset: UTF-8 + +OS Locale: mr_IN.utf8 +default locale: ID: mr_IN, Name: Marathi (India) +display locale: ID: mr_IN, Name: Marathi (India) +format locale: ID: mr_IN, Name: Marathi (India) +default charset: UTF-8 + +OS Locale: ms_MY +default locale: ID: ms_MY, Name: Malay (Malaysia) +display locale: ID: ms_MY, Name: Malay (Malaysia) +format locale: ID: ms_MY, Name: Malay (Malaysia) +default charset: ISO-8859-1 + +OS Locale: ms_MY.iso88591 +default locale: ID: ms_MY, Name: Malay (Malaysia) +display locale: ID: ms_MY, Name: Malay (Malaysia) +format locale: ID: ms_MY, Name: Malay (Malaysia) +default charset: ISO-8859-1 + +OS Locale: ms_MY.utf8 +default locale: ID: ms_MY, Name: Malay (Malaysia) +display locale: ID: ms_MY, Name: Malay (Malaysia) +format locale: ID: ms_MY, Name: Malay (Malaysia) +default charset: UTF-8 + +OS Locale: mt_MT +default locale: ID: mt_MT, Name: Maltese (Malta) +display locale: ID: mt_MT, Name: Maltese (Malta) +format locale: ID: mt_MT, Name: Maltese (Malta) +default charset: ISO-8859-3 + +OS Locale: mt_MT.iso88593 +default locale: ID: mt_MT, Name: Maltese (Malta) +display locale: ID: mt_MT, Name: Maltese (Malta) +format locale: ID: mt_MT, Name: Maltese (Malta) +default charset: ISO-8859-3 + +OS Locale: mt_MT.utf8 +default locale: ID: mt_MT, Name: Maltese (Malta) +display locale: ID: mt_MT, Name: Maltese (Malta) +format locale: ID: mt_MT, Name: Maltese (Malta) +default charset: UTF-8 + +OS Locale: nb_NO +default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +default charset: ISO-8859-1 + +OS Locale: nb_NO.iso88591 +default locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +display locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +format locale: ID: nb_NO, Name: Norwegian Bokmål (Norway) +default charset: ISO-8859-1 + +OS Locale: nb_NO.utf8 +default locale: ID: nb_NO, Name: Norwegian BokmÃ¥l (Norway) +display locale: ID: nb_NO, Name: Norwegian BokmÃ¥l (Norway) +format locale: ID: nb_NO, Name: Norwegian BokmÃ¥l (Norway) +default charset: UTF-8 + +OS Locale: ne_NP +default locale: ID: ne_NP, Name: Nepali (Nepal) +display locale: ID: ne_NP, Name: Nepali (Nepal) +format locale: ID: ne_NP, Name: Nepali (Nepal) +default charset: UTF-8 + +OS Locale: ne_NP.utf8 +default locale: ID: ne_NP, Name: Nepali (Nepal) +display locale: ID: ne_NP, Name: Nepali (Nepal) +format locale: ID: ne_NP, Name: Nepali (Nepal) +default charset: UTF-8 + +OS Locale: nl_BE +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-1 + +OS Locale: nl_BE.iso88591 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-1 + +OS Locale: nl_BE.iso885915@euro +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-15 + +OS Locale: nl_BE.utf8 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: UTF-8 + +OS Locale: nl_BE@euro +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-15 + +OS Locale: nl_NL +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: nl_NL.iso88591 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: nl_NL.iso885915@euro +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 + +OS Locale: nl_NL.utf8 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: UTF-8 + +OS Locale: nl_NL@euro +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 + +OS Locale: nn_NO +default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +default charset: ISO-8859-1 + +OS Locale: nn_NO.iso88591 +default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +default charset: ISO-8859-1 + +OS Locale: nn_NO.utf8 +default locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +display locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +format locale: ID: nn_NO, Name: Norwegian Nynorsk (Norway) +default charset: UTF-8 + +OS Locale: no_NO +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: no_NO.iso88591 +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: no_NO.utf8 +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: UTF-8 + +OS Locale: norwegian +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: nr_ZA +default locale: ID: nr_ZA, Name: South Ndebele (South Africa) +display locale: ID: nr_ZA, Name: South Ndebele (South Africa) +format locale: ID: nr_ZA, Name: South Ndebele (South Africa) +default charset: UTF-8 + +OS Locale: nr_ZA.utf8 +default locale: ID: nr_ZA, Name: South Ndebele (South Africa) +display locale: ID: nr_ZA, Name: South Ndebele (South Africa) +format locale: ID: nr_ZA, Name: South Ndebele (South Africa) +default charset: UTF-8 + +OS Locale: nso_ZA +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: UTF-8 + +OS Locale: nso_ZA.utf8 +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: UTF-8 + +OS Locale: nynorsk +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: ISO-8859-1 + +OS Locale: oc_FR +default locale: ID: oc_FR, Name: Occitan (France) +display locale: ID: oc_FR, Name: Occitan (France) +format locale: ID: oc_FR, Name: Occitan (France) +default charset: ISO-8859-1 + +OS Locale: oc_FR.iso88591 +default locale: ID: oc_FR, Name: Occitan (France) +display locale: ID: oc_FR, Name: Occitan (France) +format locale: ID: oc_FR, Name: Occitan (France) +default charset: ISO-8859-1 + +OS Locale: oc_FR.utf8 +default locale: ID: oc_FR, Name: Occitan (France) +display locale: ID: oc_FR, Name: Occitan (France) +format locale: ID: oc_FR, Name: Occitan (France) +default charset: UTF-8 + +OS Locale: om_ET +default locale: ID: om_ET, Name: Oromo (Ethiopia) +display locale: ID: om_ET, Name: Oromo (Ethiopia) +format locale: ID: om_ET, Name: Oromo (Ethiopia) +default charset: UTF-8 + +OS Locale: om_ET.utf8 +default locale: ID: om_ET, Name: Oromo (Ethiopia) +display locale: ID: om_ET, Name: Oromo (Ethiopia) +format locale: ID: om_ET, Name: Oromo (Ethiopia) +default charset: UTF-8 + +OS Locale: om_KE +default locale: ID: om_KE, Name: Oromo (Kenya) +display locale: ID: om_KE, Name: Oromo (Kenya) +format locale: ID: om_KE, Name: Oromo (Kenya) +default charset: ISO-8859-1 + +OS Locale: om_KE.iso88591 +default locale: ID: om_KE, Name: Oromo (Kenya) +display locale: ID: om_KE, Name: Oromo (Kenya) +format locale: ID: om_KE, Name: Oromo (Kenya) +default charset: ISO-8859-1 + +OS Locale: om_KE.utf8 +default locale: ID: om_KE, Name: Oromo (Kenya) +display locale: ID: om_KE, Name: Oromo (Kenya) +format locale: ID: om_KE, Name: Oromo (Kenya) +default charset: UTF-8 + +OS Locale: or_IN +default locale: ID: or_IN, Name: Oriya (India) +display locale: ID: or_IN, Name: Oriya (India) +format locale: ID: or_IN, Name: Oriya (India) +default charset: UTF-8 + +OS Locale: or_IN.utf8 +default locale: ID: or_IN, Name: Oriya (India) +display locale: ID: or_IN, Name: Oriya (India) +format locale: ID: or_IN, Name: Oriya (India) +default charset: UTF-8 + +OS Locale: pa_IN +default locale: ID: pa_IN, Name: Panjabi (India) +display locale: ID: pa_IN, Name: Panjabi (India) +format locale: ID: pa_IN, Name: Panjabi (India) +default charset: UTF-8 + +OS Locale: pa_IN.utf8 +default locale: ID: pa_IN, Name: Panjabi (India) +display locale: ID: pa_IN, Name: Panjabi (India) +format locale: ID: pa_IN, Name: Panjabi (India) +default charset: UTF-8 + +OS Locale: pa_PK +default locale: ID: pa_PK, Name: Panjabi (Pakistan) +display locale: ID: pa_PK, Name: Panjabi (Pakistan) +format locale: ID: pa_PK, Name: Panjabi (Pakistan) +default charset: UTF-8 + +OS Locale: pa_PK.utf8 +default locale: ID: pa_PK, Name: Panjabi (Pakistan) +display locale: ID: pa_PK, Name: Panjabi (Pakistan) +format locale: ID: pa_PK, Name: Panjabi (Pakistan) +default charset: UTF-8 + +OS Locale: pl_PL +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: pl_PL.iso88592 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: pl_PL.utf8 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: UTF-8 + +OS Locale: polish +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: portuguese +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt_BR +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: ISO-8859-1 + +OS Locale: pt_BR.iso88591 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: ISO-8859-1 + +OS Locale: pt_BR.utf8 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: UTF-8 + +OS Locale: pt_PT +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt_PT.iso88591 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt_PT.iso885915@euro +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 + +OS Locale: pt_PT.utf8 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: UTF-8 + +OS Locale: pt_PT@euro +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 + +OS Locale: ro_RO +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 + +OS Locale: ro_RO.iso88592 +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 + +OS Locale: ro_RO.utf8 +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: UTF-8 + +OS Locale: romanian +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 + +OS Locale: ru_RU +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: ru_RU.iso88595 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: ru_RU.koi8r +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: KOI8-R + +OS Locale: ru_RU.utf8 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: UTF-8 + +OS Locale: ru_UA +default locale: ID: ru_UA, Name: Russian (Ukraine) +display locale: ID: ru_UA, Name: Russian (Ukraine) +format locale: ID: ru_UA, Name: Russian (Ukraine) +default charset: KOI8-U + +OS Locale: ru_UA.koi8u +default locale: ID: ru_UA, Name: Russian (Ukraine) +display locale: ID: ru_UA, Name: Russian (Ukraine) +format locale: ID: ru_UA, Name: Russian (Ukraine) +default charset: KOI8-U + +OS Locale: ru_UA.utf8 +default locale: ID: ru_UA, Name: Russian (Ukraine) +display locale: ID: ru_UA, Name: Russian (Ukraine) +format locale: ID: ru_UA, Name: Russian (Ukraine) +default charset: UTF-8 + +OS Locale: russian +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: rw_RW +default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +display locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +default charset: UTF-8 + +OS Locale: rw_RW.utf8 +default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +display locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +default charset: UTF-8 + +OS Locale: se_NO +default locale: ID: se_NO, Name: Northern Sami (Norway) +display locale: ID: se_NO, Name: Northern Sami (Norway) +format locale: ID: se_NO, Name: Northern Sami (Norway) +default charset: UTF-8 + +OS Locale: se_NO.utf8 +default locale: ID: se_NO, Name: Northern Sami (Norway) +display locale: ID: se_NO, Name: Northern Sami (Norway) +format locale: ID: se_NO, Name: Northern Sami (Norway) +default charset: UTF-8 + +OS Locale: si_LK +default locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +display locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +format locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +default charset: UTF-8 + +OS Locale: si_LK.utf8 +default locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +display locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +format locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +default charset: UTF-8 + +OS Locale: sid_ET +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: sid_ET.utf8 +default locale: ID: en_ET, Name: English (Ethiopia) +display locale: ID: en_ET, Name: English (Ethiopia) +format locale: ID: en_ET, Name: English (Ethiopia) +default charset: UTF-8 + +OS Locale: sk_SK +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 + +OS Locale: sk_SK.iso88592 +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 + +OS Locale: sk_SK.utf8 +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: UTF-8 + +OS Locale: sl_SI +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: sl_SI.iso88592 +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: sl_SI.utf8 +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: UTF-8 + +OS Locale: slovak +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 + +OS Locale: slovene +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: slovenian +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: so_DJ +default locale: ID: so_DJ, Name: Somali (Djibouti) +display locale: ID: so_DJ, Name: Somali (Djibouti) +format locale: ID: so_DJ, Name: Somali (Djibouti) +default charset: ISO-8859-1 + +OS Locale: so_DJ.iso88591 +default locale: ID: so_DJ, Name: Somali (Djibouti) +display locale: ID: so_DJ, Name: Somali (Djibouti) +format locale: ID: so_DJ, Name: Somali (Djibouti) +default charset: ISO-8859-1 + +OS Locale: so_DJ.utf8 +default locale: ID: so_DJ, Name: Somali (Djibouti) +display locale: ID: so_DJ, Name: Somali (Djibouti) +format locale: ID: so_DJ, Name: Somali (Djibouti) +default charset: UTF-8 + +OS Locale: so_ET +default locale: ID: so_ET, Name: Somali (Ethiopia) +display locale: ID: so_ET, Name: Somali (Ethiopia) +format locale: ID: so_ET, Name: Somali (Ethiopia) +default charset: UTF-8 + +OS Locale: so_ET.utf8 +default locale: ID: so_ET, Name: Somali (Ethiopia) +display locale: ID: so_ET, Name: Somali (Ethiopia) +format locale: ID: so_ET, Name: Somali (Ethiopia) +default charset: UTF-8 + +OS Locale: so_KE +default locale: ID: so_KE, Name: Somali (Kenya) +display locale: ID: so_KE, Name: Somali (Kenya) +format locale: ID: so_KE, Name: Somali (Kenya) +default charset: ISO-8859-1 + +OS Locale: so_KE.iso88591 +default locale: ID: so_KE, Name: Somali (Kenya) +display locale: ID: so_KE, Name: Somali (Kenya) +format locale: ID: so_KE, Name: Somali (Kenya) +default charset: ISO-8859-1 + +OS Locale: so_KE.utf8 +default locale: ID: so_KE, Name: Somali (Kenya) +display locale: ID: so_KE, Name: Somali (Kenya) +format locale: ID: so_KE, Name: Somali (Kenya) +default charset: UTF-8 + +OS Locale: so_SO +default locale: ID: so_SO, Name: Somali (Somalia) +display locale: ID: so_SO, Name: Somali (Somalia) +format locale: ID: so_SO, Name: Somali (Somalia) +default charset: ISO-8859-1 + +OS Locale: so_SO.iso88591 +default locale: ID: so_SO, Name: Somali (Somalia) +display locale: ID: so_SO, Name: Somali (Somalia) +format locale: ID: so_SO, Name: Somali (Somalia) +default charset: ISO-8859-1 + +OS Locale: so_SO.utf8 +default locale: ID: so_SO, Name: Somali (Somalia) +display locale: ID: so_SO, Name: Somali (Somalia) +format locale: ID: so_SO, Name: Somali (Somalia) +default charset: UTF-8 + +OS Locale: spanish +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: sq_AL +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: ISO-8859-1 + +OS Locale: sq_AL.iso88591 +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: ISO-8859-1 + +OS Locale: sq_AL.utf8 +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: UTF-8 + +OS Locale: sr_CS +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: ISO-8859-5 + +OS Locale: sr_CS.iso88595 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: ISO-8859-5 + +OS Locale: sr_CS.utf8 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: UTF-8 + +OS Locale: sr_ME +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_ME.utf8 +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_RS +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_RS.utf8 +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_RS.utf8@latin +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: sr_RS@latin +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: UTF-8 + +OS Locale: ss_ZA +default locale: ID: ss_ZA, Name: Swati (South Africa) +display locale: ID: ss_ZA, Name: Swati (South Africa) +format locale: ID: ss_ZA, Name: Swati (South Africa) +default charset: UTF-8 + +OS Locale: ss_ZA.utf8 +default locale: ID: ss_ZA, Name: Swati (South Africa) +display locale: ID: ss_ZA, Name: Swati (South Africa) +format locale: ID: ss_ZA, Name: Swati (South Africa) +default charset: UTF-8 + +OS Locale: st_ZA +default locale: ID: st_ZA, Name: Southern Sotho (South Africa) +display locale: ID: st_ZA, Name: Southern Sotho (South Africa) +format locale: ID: st_ZA, Name: Southern Sotho (South Africa) +default charset: ISO-8859-1 + +OS Locale: st_ZA.iso88591 +default locale: ID: st_ZA, Name: Southern Sotho (South Africa) +display locale: ID: st_ZA, Name: Southern Sotho (South Africa) +format locale: ID: st_ZA, Name: Southern Sotho (South Africa) +default charset: ISO-8859-1 + +OS Locale: st_ZA.utf8 +default locale: ID: st_ZA, Name: Southern Sotho (South Africa) +display locale: ID: st_ZA, Name: Southern Sotho (South Africa) +format locale: ID: st_ZA, Name: Southern Sotho (South Africa) +default charset: UTF-8 + +OS Locale: sv_FI +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: ISO-8859-1 + +OS Locale: sv_FI.iso88591 +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: ISO-8859-1 + +OS Locale: sv_FI.iso885915@euro +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: ISO-8859-15 + +OS Locale: sv_FI.utf8 +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: UTF-8 + +OS Locale: sv_FI@euro +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: sv_FI, Name: Swedish (Finland) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: ISO-8859-15 + +OS Locale: sv_SE +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: sv_SE.iso88591 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: sv_SE.iso885915 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-15 + +OS Locale: sv_SE.utf8 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: UTF-8 + +OS Locale: swedish +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: ta_IN +default locale: ID: ta_IN, Name: Tamil (India) +display locale: ID: ta_IN, Name: Tamil (India) +format locale: ID: ta_IN, Name: Tamil (India) +default charset: UTF-8 + +OS Locale: ta_IN.utf8 +default locale: ID: ta_IN, Name: Tamil (India) +display locale: ID: ta_IN, Name: Tamil (India) +format locale: ID: ta_IN, Name: Tamil (India) +default charset: UTF-8 + +OS Locale: te_IN +default locale: ID: te_IN, Name: Telugu (India) +display locale: ID: te_IN, Name: Telugu (India) +format locale: ID: te_IN, Name: Telugu (India) +default charset: UTF-8 + +OS Locale: te_IN.utf8 +default locale: ID: te_IN, Name: Telugu (India) +display locale: ID: te_IN, Name: Telugu (India) +format locale: ID: te_IN, Name: Telugu (India) +default charset: UTF-8 + +OS Locale: tg_TJ +default locale: ID: tg_TJ, Name: Tajik (Tajikistan) +display locale: ID: tg_TJ, Name: Tajik (Tajikistan) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: UTF-8 + +OS Locale: tg_TJ.koi8t +default locale: ID: tg_TJ, Name: Tajik (Tajikistan) +display locale: ID: tg_TJ, Name: Tajik (Tajikistan) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: UTF-8 + +OS Locale: tg_TJ.utf8 +default locale: ID: tg_TJ, Name: Tajik (Tajikistan) +display locale: ID: tg_TJ, Name: Tajik (Tajikistan) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: UTF-8 + +OS Locale: th_TH +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 + +OS Locale: th_TH.tis620 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 + +OS Locale: th_TH.utf8 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: UTF-8 + +OS Locale: thai +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: TIS-620 + +OS Locale: ti_ER +default locale: ID: ti_ER, Name: Tigrinya (Eritrea) +display locale: ID: ti_ER, Name: Tigrinya (Eritrea) +format locale: ID: ti_ER, Name: Tigrinya (Eritrea) +default charset: UTF-8 + +OS Locale: ti_ER.utf8 +default locale: ID: ti_ER, Name: Tigrinya (Eritrea) +display locale: ID: ti_ER, Name: Tigrinya (Eritrea) +format locale: ID: ti_ER, Name: Tigrinya (Eritrea) +default charset: UTF-8 + +OS Locale: ti_ET +default locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +display locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +format locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +default charset: UTF-8 + +OS Locale: ti_ET.utf8 +default locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +display locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +format locale: ID: ti_ET, Name: Tigrinya (Ethiopia) +default charset: UTF-8 + +OS Locale: tig_ER +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: tig_ER.utf8 +default locale: ID: en_ER, Name: English (Eritrea) +display locale: ID: en_ER, Name: English (Eritrea) +format locale: ID: en_ER, Name: English (Eritrea) +default charset: UTF-8 + +OS Locale: tl_PH +default locale: ID: tl_PH, Name: Tagalog (Philippines) +display locale: ID: tl_PH, Name: Tagalog (Philippines) +format locale: ID: tl_PH, Name: Tagalog (Philippines) +default charset: ISO-8859-1 + +OS Locale: tl_PH.iso88591 +default locale: ID: tl_PH, Name: Tagalog (Philippines) +display locale: ID: tl_PH, Name: Tagalog (Philippines) +format locale: ID: tl_PH, Name: Tagalog (Philippines) +default charset: ISO-8859-1 + +OS Locale: tl_PH.utf8 +default locale: ID: tl_PH, Name: Tagalog (Philippines) +display locale: ID: tl_PH, Name: Tagalog (Philippines) +format locale: ID: tl_PH, Name: Tagalog (Philippines) +default charset: UTF-8 + +OS Locale: tn_ZA +default locale: ID: tn_ZA, Name: Tswana (South Africa) +display locale: ID: tn_ZA, Name: Tswana (South Africa) +format locale: ID: tn_ZA, Name: Tswana (South Africa) +default charset: UTF-8 + +OS Locale: tn_ZA.utf8 +default locale: ID: tn_ZA, Name: Tswana (South Africa) +display locale: ID: tn_ZA, Name: Tswana (South Africa) +format locale: ID: tn_ZA, Name: Tswana (South Africa) +default charset: UTF-8 + +OS Locale: tr_CY +default locale: ID: tr_CY, Name: Turkish (Cyprus) +display locale: ID: tr_CY, Name: Turkish (Cyprus) +format locale: ID: tr_CY, Name: Turkish (Cyprus) +default charset: ISO-8859-9 + +OS Locale: tr_CY.iso88599 +default locale: ID: tr_CY, Name: Turkish (Cyprus) +display locale: ID: tr_CY, Name: Turkish (Cyprus) +format locale: ID: tr_CY, Name: Turkish (Cyprus) +default charset: ISO-8859-9 + +OS Locale: tr_CY.utf8 +default locale: ID: tr_CY, Name: Turkish (Cyprus) +display locale: ID: tr_CY, Name: Turkish (Cyprus) +format locale: ID: tr_CY, Name: Turkish (Cyprus) +default charset: UTF-8 + +OS Locale: tr_TR +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: tr_TR.iso88599 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: tr_TR.utf8 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: UTF-8 + +OS Locale: ts_ZA +default locale: ID: ts_ZA, Name: Tsonga (South Africa) +display locale: ID: ts_ZA, Name: Tsonga (South Africa) +format locale: ID: ts_ZA, Name: Tsonga (South Africa) +default charset: UTF-8 + +OS Locale: ts_ZA.utf8 +default locale: ID: ts_ZA, Name: Tsonga (South Africa) +display locale: ID: ts_ZA, Name: Tsonga (South Africa) +format locale: ID: ts_ZA, Name: Tsonga (South Africa) +default charset: UTF-8 + +OS Locale: tt_RU.utf8 +default locale: ID: tt_RU, Name: Tatar (Russia) +display locale: ID: tt_RU, Name: Tatar (Russia) +format locale: ID: tt_RU, Name: Tatar (Russia) +default charset: UTF-8 + +OS Locale: turkish +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: uk_UA +default locale: ID: uk_UA, Name: Ukrainian (Ukraine) +display locale: ID: uk_UA, Name: Ukrainian (Ukraine) +format locale: ID: uk_UA, Name: Ukrainian (Ukraine) +default charset: KOI8-U + +OS Locale: uk_UA.koi8u +default locale: ID: uk_UA, Name: Ukrainian (Ukraine) +display locale: ID: uk_UA, Name: Ukrainian (Ukraine) +format locale: ID: uk_UA, Name: Ukrainian (Ukraine) +default charset: KOI8-U + +OS Locale: uk_UA.utf8 +default locale: ID: uk_UA, Name: Ukrainian (Ukraine) +display locale: ID: uk_UA, Name: Ukrainian (Ukraine) +format locale: ID: uk_UA, Name: Ukrainian (Ukraine) +default charset: UTF-8 + +OS Locale: ur_PK +default locale: ID: ur_PK, Name: Urdu (Pakistan) +display locale: ID: ur_PK, Name: Urdu (Pakistan) +format locale: ID: ur_PK, Name: Urdu (Pakistan) +default charset: UTF-8 + +OS Locale: ur_PK.utf8 +default locale: ID: ur_PK, Name: Urdu (Pakistan) +display locale: ID: ur_PK, Name: Urdu (Pakistan) +format locale: ID: ur_PK, Name: Urdu (Pakistan) +default charset: UTF-8 + +OS Locale: uz_UZ +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: ISO-8859-1 + +OS Locale: uz_UZ.iso88591 +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: ISO-8859-1 + +OS Locale: uz_UZ.utf8@cyrillic +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: UTF-8 + +OS Locale: uz_UZ@cyrillic +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: UTF-8 + +OS Locale: ve_ZA +default locale: ID: ve_ZA, Name: Venda (South Africa) +display locale: ID: ve_ZA, Name: Venda (South Africa) +format locale: ID: ve_ZA, Name: Venda (South Africa) +default charset: UTF-8 + +OS Locale: ve_ZA.utf8 +default locale: ID: ve_ZA, Name: Venda (South Africa) +display locale: ID: ve_ZA, Name: Venda (South Africa) +format locale: ID: ve_ZA, Name: Venda (South Africa) +default charset: UTF-8 + +OS Locale: vi_VN +default locale: ID: vi_VN, Name: Vietnamese (Vietnam) +display locale: ID: vi_VN, Name: Vietnamese (Vietnam) +format locale: ID: vi_VN, Name: Vietnamese (Vietnam) +default charset: UTF-8 + +OS Locale: vi_VN.tcvn +default locale: ID: vi_VN, Name: Vietnamese (Vietnam) +display locale: ID: vi_VN, Name: Vietnamese (Vietnam) +format locale: ID: vi_VN, Name: Vietnamese (Vietnam) +default charset: UTF-8 + +OS Locale: vi_VN.utf8 +default locale: ID: vi_VN, Name: Vietnamese (Vietnam) +display locale: ID: vi_VN, Name: Vietnamese (Vietnam) +format locale: ID: vi_VN, Name: Vietnamese (Vietnam) +default charset: UTF-8 + +OS Locale: wa_BE +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: ISO-8859-1 + +OS Locale: wa_BE.iso88591 +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: ISO-8859-1 + +OS Locale: wa_BE.iso885915@euro +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: ISO-8859-15 + +OS Locale: wa_BE.utf8 +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: UTF-8 + +OS Locale: wa_BE@euro +default locale: ID: wa_BE, Name: Walloon (Belgium) +display locale: ID: wa_BE, Name: Walloon (Belgium) +format locale: ID: wa_BE, Name: Walloon (Belgium) +default charset: ISO-8859-15 + +OS Locale: xh_ZA +default locale: ID: xh_ZA, Name: Xhosa (South Africa) +display locale: ID: xh_ZA, Name: Xhosa (South Africa) +format locale: ID: xh_ZA, Name: Xhosa (South Africa) +default charset: ISO-8859-1 + +OS Locale: xh_ZA.iso88591 +default locale: ID: xh_ZA, Name: Xhosa (South Africa) +display locale: ID: xh_ZA, Name: Xhosa (South Africa) +format locale: ID: xh_ZA, Name: Xhosa (South Africa) +default charset: ISO-8859-1 + +OS Locale: xh_ZA.utf8 +default locale: ID: xh_ZA, Name: Xhosa (South Africa) +display locale: ID: xh_ZA, Name: Xhosa (South Africa) +format locale: ID: xh_ZA, Name: Xhosa (South Africa) +default charset: UTF-8 + +OS Locale: yi_US +default locale: ID: ji_US, Name: Yiddish (United States) +display locale: ID: ji_US, Name: Yiddish (United States) +format locale: ID: ji_US, Name: Yiddish (United States) +default charset: windows-1255 + +OS Locale: yi_US.cp1255 +default locale: ID: ji_US, Name: Yiddish (United States) +display locale: ID: ji_US, Name: Yiddish (United States) +format locale: ID: ji_US, Name: Yiddish (United States) +default charset: windows-1255 + +OS Locale: yi_US.utf8 +default locale: ID: ji_US, Name: Yiddish (United States) +display locale: ID: ji_US, Name: Yiddish (United States) +format locale: ID: ji_US, Name: Yiddish (United States) +default charset: UTF-8 + +OS Locale: zh_CN +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh_CN.gb18030 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 + +OS Locale: zh_CN.gb2312 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh_CN.gbk +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale: zh_CN.utf8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale: zh_HK +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: Big5-HKSCS + +OS Locale: zh_HK.big5hkscs +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: Big5-HKSCS + +OS Locale: zh_HK.utf8 +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: UTF-8 + +OS Locale: zh_SG +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: zh_SG, Name: Chinese (Singapore) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: GB2312 + +OS Locale: zh_SG.gb2312 +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: zh_SG, Name: Chinese (Singapore) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: GB2312 + +OS Locale: zh_SG.gbk +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: zh_SG, Name: Chinese (Singapore) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: GBK + +OS Locale: zh_SG.utf8 +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: zh_SG, Name: Chinese (Singapore) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: UTF-8 + +OS Locale: zh_TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: Big5 + +OS Locale: zh_TW.big5 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: Big5 + +OS Locale: zh_TW.euctw +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW + +OS Locale: zh_TW.utf8 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 + +OS Locale: zu_ZA +default locale: ID: zu_ZA, Name: Zulu (South Africa) +display locale: ID: zu_ZA, Name: Zulu (South Africa) +format locale: ID: zu_ZA, Name: Zulu (South Africa) +default charset: ISO-8859-1 + +OS Locale: zu_ZA.iso88591 +default locale: ID: zu_ZA, Name: Zulu (South Africa) +display locale: ID: zu_ZA, Name: Zulu (South Africa) +format locale: ID: zu_ZA, Name: Zulu (South Africa) +default charset: ISO-8859-1 + +OS Locale: zu_ZA.utf8 +default locale: ID: zu_ZA, Name: Zulu (South Africa) +display locale: ID: zu_ZA, Name: Zulu (South Africa) +format locale: ID: zu_ZA, Name: Zulu (South Africa) +default charset: UTF-8 + +Testing some typical combinations + + +OS Locale (LC_CTYPE: ja_JP.UTF-8, LC_MESSAGES: zh_CN.UTF-8) +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: UTF-8 + +OS Locale (LC_CTYPE: zh_CN.UTF-8, LC_MESSAGES: en_US.UTF-8) +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale (LC_CTYPE: C, LC_MESSAGES: zh_CN.UTF-8) +default locale: ID: en_US, Name: English (United States) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: en_US, Name: English (United States) +default charset: US-ASCII diff --git a/jdk/test/java/util/Locale/data/deflocale.sh b/jdk/test/java/util/Locale/data/deflocale.sh index d3846c7ee69..161f0b66818 100644 --- a/jdk/test/java/util/Locale/data/deflocale.sh +++ b/jdk/test/java/util/Locale/data/deflocale.sh @@ -31,8 +31,21 @@ # cat /etc/*release uname -a -env LC_COLLATE=C ls /usr/lib/locale | while read line; do +echo "Testing all available locales" +/usr/bin/locale -a | while read line; do echo "" echo "OS Locale: " $line - env LANG=$line LC_ALL=$line $1 PrintDefaultLocale + env LC_ALL= LC_CTYPE= LC_MESSAGES= LANG=$line $1 $2 $3 $4 $5 $6 $7 $8 $9 PrintDefaultLocale done + +echo "" +echo "Testing some typical combinations" +echo "" +while read lcctype lcmessages; do + if [ "$lcctype" = "#" -o "$lcctype" = "" ]; then + continue + fi + echo "" + echo "OS Locale (LC_CTYPE: "$lcctype", LC_MESSAGES: "$lcmessages")" + env LC_ALL= LC_CTYPE=$lcctype LC_MESSAGES=$lcmessages $1 $2 $3 $4 $5 $6 $7 $8 $9 PrintDefaultLocale +done < deflocale.input diff --git a/jdk/test/java/util/Locale/data/deflocale.sol10 b/jdk/test/java/util/Locale/data/deflocale.sol10 index 712a1e159ec..1bd4a9884c2 100644 --- a/jdk/test/java/util/Locale/data/deflocale.sol10 +++ b/jdk/test/java/util/Locale/data/deflocale.sol10 @@ -2,1449 +2,1724 @@ (copyright from `uname -a` goes here) -SunOS deltas4 5.10 Generic_118833-03 sun4u sparc SUNW,Sun-Blade-2500 +SunOS deltas4 5.10 Generic_142900-03 sun4u sparc SUNW,Sun-Blade-2500 +Testing all available locales OS Locale: C -en -English -US-ASCII +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: US-ASCII OS Locale: POSIX -en -English -US-ASCII +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: US-ASCII OS Locale: ar -ar_EG -Arabic (Egypt) -ISO-8859-6 +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: ISO-8859-6 OS Locale: ar_EG.UTF-8 -ar_EG -Arabic (Egypt) -UTF-8 +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: UTF-8 OS Locale: ar_SA.UTF-8 -ar_SA -Arabic (Saudi Arabia) -UTF-8 +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: UTF-8 OS Locale: bg_BG -bg_BG -Bulgarian (Bulgaria) -ISO-8859-5 +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: ISO-8859-5 OS Locale: bg_BG.ISO8859-5 -bg_BG -Bulgarian (Bulgaria) -ISO-8859-5 +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: ISO-8859-5 OS Locale: ca -ca_ES -Catalan (Spain) -ISO-8859-1 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 OS Locale: ca_ES -ca_ES -Catalan (Spain) -ISO-8859-1 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 OS Locale: ca_ES.ISO8859-1 -ca_ES -Catalan (Spain) -ISO-8859-1 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 OS Locale: ca_ES.ISO8859-15 -ca_ES -Catalan (Spain) -ISO-8859-15 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-15 OS Locale: ca_ES.ISO8859-15@euro -ca_ES -Catalan (Spain) -ISO-8859-15 - -OS Locale: common -en -English -ISO-8859-1 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-15 OS Locale: cs_CZ -cs_CZ -Czech (Czech Republic) -ISO-8859-2 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 OS Locale: cs_CZ.ISO8859-2 -cs_CZ -Czech (Czech Republic) -ISO-8859-2 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 OS Locale: cs_CZ.UTF-8 -cs_CZ -Czech (Czech Republic) -UTF-8 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: UTF-8 OS Locale: cs_CZ.UTF-8@euro -cs_CZ -Czech (Czech Republic) -UTF-8 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: UTF-8 OS Locale: cz -cs_CZ -Czech (Czech Republic) -ISO-8859-2 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 OS Locale: da -da_DK -Danish (Denmark) -ISO-8859-1 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 OS Locale: da.ISO8859-15 -da_DK -Danish (Denmark) -ISO-8859-15 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-15 OS Locale: da_DK -da_DK -Danish (Denmark) -ISO-8859-1 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 OS Locale: da_DK.ISO8859-1 -da_DK -Danish (Denmark) -ISO-8859-1 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 OS Locale: da_DK.ISO8859-15 -da_DK -Danish (Denmark) -ISO-8859-15 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-15 OS Locale: da_DK.ISO8859-15@euro -da_DK -Danish (Denmark) -ISO-8859-15 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-15 OS Locale: de -de_DE -German (Germany) -ISO-8859-1 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 OS Locale: de.ISO8859-15 -de_DE -German (Germany) -ISO-8859-15 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 OS Locale: de.UTF-8 -de_DE -German (Germany) -UTF-8 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: UTF-8 OS Locale: de_AT -de_AT -German (Austria) -ISO-8859-1 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-1 OS Locale: de_AT.ISO8859-1 -de_AT -German (Austria) -ISO-8859-1 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-1 OS Locale: de_AT.ISO8859-15 -de_AT -German (Austria) -ISO-8859-15 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-15 OS Locale: de_AT.ISO8859-15@euro -de_AT -German (Austria) -ISO-8859-15 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-15 OS Locale: de_CH -de_CH -German (Switzerland) -ISO-8859-1 +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: ISO-8859-1 OS Locale: de_CH.ISO8859-1 -de_CH -German (Switzerland) -ISO-8859-1 +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: ISO-8859-1 OS Locale: de_DE -de_DE -German (Germany) -ISO-8859-1 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 OS Locale: de_DE.ISO8859-1 -de_DE -German (Germany) -ISO-8859-1 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 OS Locale: de_DE.ISO8859-15 -de_DE -German (Germany) -ISO-8859-15 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 OS Locale: de_DE.ISO8859-15@euro -de_DE -German (Germany) -ISO-8859-15 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 OS Locale: de_DE.UTF-8 -de_DE -German (Germany) -UTF-8 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: UTF-8 OS Locale: de_DE.UTF-8@euro -de_DE -German (Germany) -UTF-8 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: UTF-8 OS Locale: el -el_GR -Greek (Greece) -ISO-8859-7 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 OS Locale: el.sun_eu_greek -el_GR -Greek (Greece) -ISO-8859-7 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 OS Locale: el_GR -el_GR -Greek (Greece) -ISO-8859-7 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 OS Locale: el_GR.ISO8859-7 -el_GR -Greek (Greece) -ISO-8859-7 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 OS Locale: el_GR.ISO8859-7@euro -el_GR -Greek (Greece) -ISO-8859-7 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 OS Locale: en_AU -en_AU -English (Australia) -ISO-8859-1 +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: ISO-8859-1 OS Locale: en_AU.ISO8859-1 -en_AU -English (Australia) -ISO-8859-1 +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: ISO-8859-1 OS Locale: en_CA -en_CA -English (Canada) -ISO-8859-1 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: ISO-8859-1 OS Locale: en_CA.ISO8859-1 -en_CA -English (Canada) -ISO-8859-1 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: ISO-8859-1 + +OS Locale: en_CA.UTF-8 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: UTF-8 OS Locale: en_GB -en_GB -English (United Kingdom) -ISO-8859-1 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-1 OS Locale: en_GB.ISO8859-1 -en_GB -English (United Kingdom) -ISO-8859-1 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-1 OS Locale: en_GB.ISO8859-15 -en_GB -English (United Kingdom) -ISO-8859-15 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-15 OS Locale: en_GB.ISO8859-15@euro -en_GB -English (United Kingdom) -ISO-8859-15 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-15 OS Locale: en_IE -en_IE -English (Ireland) -ISO-8859-1 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-1 OS Locale: en_IE.ISO8859-1 -en_IE -English (Ireland) -ISO-8859-1 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-1 OS Locale: en_IE.ISO8859-15 -en_IE -English (Ireland) -ISO-8859-15 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-15 OS Locale: en_IE.ISO8859-15@euro -en_IE -English (Ireland) -ISO-8859-15 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-15 OS Locale: en_NZ -en_NZ -English (New Zealand) -ISO-8859-1 +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: ISO-8859-1 OS Locale: en_NZ.ISO8859-1 -en_NZ -English (New Zealand) -ISO-8859-1 +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: ISO-8859-1 OS Locale: en_US -en_US -English (United States) -ISO-8859-1 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-1 OS Locale: en_US.ISO8859-1 -en_US -English (United States) -ISO-8859-1 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-1 OS Locale: en_US.ISO8859-15 -en_US -English (United States) -ISO-8859-15 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-15 OS Locale: en_US.ISO8859-15@euro -en_US -English (United States) -ISO-8859-15 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-15 OS Locale: en_US.UTF-8 -en_US -English (United States) -UTF-8 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: UTF-8 OS Locale: es -es_ES -Spanish (Spain) -ISO-8859-1 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 OS Locale: es.ISO8859-15 -es_ES -Spanish (Spain) -ISO-8859-15 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 OS Locale: es.UTF-8 -es_ES -Spanish (Spain) -UTF-8 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: UTF-8 OS Locale: es_AR -es_AR -Spanish (Argentina) -ISO-8859-1 +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: ISO-8859-1 OS Locale: es_AR.ISO8859-1 -es_AR -Spanish (Argentina) -ISO-8859-1 +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: ISO-8859-1 OS Locale: es_BO -es_BO -Spanish (Bolivia) -ISO-8859-1 +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: ISO-8859-1 OS Locale: es_BO.ISO8859-1 -es_BO -Spanish (Bolivia) -ISO-8859-1 +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: ISO-8859-1 OS Locale: es_CL -es_CL -Spanish (Chile) -ISO-8859-1 +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: ISO-8859-1 OS Locale: es_CL.ISO8859-1 -es_CL -Spanish (Chile) -ISO-8859-1 +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: ISO-8859-1 OS Locale: es_CO -es_CO -Spanish (Colombia) -ISO-8859-1 +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: ISO-8859-1 OS Locale: es_CO.ISO8859-1 -es_CO -Spanish (Colombia) -ISO-8859-1 +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: ISO-8859-1 OS Locale: es_CR -es_CR -Spanish (Costa Rica) -ISO-8859-1 +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: ISO-8859-1 OS Locale: es_CR.ISO8859-1 -es_CR -Spanish (Costa Rica) -ISO-8859-1 +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: ISO-8859-1 OS Locale: es_EC -es_EC -Spanish (Ecuador) -ISO-8859-1 +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: ISO-8859-1 OS Locale: es_EC.ISO8859-1 -es_EC -Spanish (Ecuador) -ISO-8859-1 +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: ISO-8859-1 OS Locale: es_ES -es_ES -Spanish (Spain) -ISO-8859-1 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 OS Locale: es_ES.ISO8859-1 -es_ES -Spanish (Spain) -ISO-8859-1 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 OS Locale: es_ES.ISO8859-15 -es_ES -Spanish (Spain) -ISO-8859-15 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 OS Locale: es_ES.ISO8859-15@euro -es_ES -Spanish (Spain) -ISO-8859-15 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 OS Locale: es_ES.UTF-8 -es_ES -Spanish (Spain) -UTF-8 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: UTF-8 OS Locale: es_ES.UTF-8@euro -es_ES -Spanish (Spain) -UTF-8 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: UTF-8 OS Locale: es_GT -es_GT -Spanish (Guatemala) -ISO-8859-1 +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: ISO-8859-1 OS Locale: es_GT.ISO8859-1 -es_GT -Spanish (Guatemala) -ISO-8859-1 +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: ISO-8859-1 OS Locale: es_MX -es_MX -Spanish (Mexico) -ISO-8859-1 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: ISO-8859-1 OS Locale: es_MX.ISO8859-1 -es_MX -Spanish (Mexico) -ISO-8859-1 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: ISO-8859-1 + +OS Locale: es_MX.UTF-8 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: UTF-8 OS Locale: es_NI -es_NI -Spanish (Nicaragua) -ISO-8859-1 +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: ISO-8859-1 OS Locale: es_NI.ISO8859-1 -es_NI -Spanish (Nicaragua) -ISO-8859-1 +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: ISO-8859-1 OS Locale: es_PA -es_PA -Spanish (Panama) -ISO-8859-1 +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: ISO-8859-1 OS Locale: es_PA.ISO8859-1 -es_PA -Spanish (Panama) -ISO-8859-1 +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: ISO-8859-1 OS Locale: es_PE -es_PE -Spanish (Peru) -ISO-8859-1 +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: ISO-8859-1 OS Locale: es_PE.ISO8859-1 -es_PE -Spanish (Peru) -ISO-8859-1 +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: ISO-8859-1 OS Locale: es_PY -es_PY -Spanish (Paraguay) -ISO-8859-1 +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: ISO-8859-1 OS Locale: es_PY.ISO8859-1 -es_PY -Spanish (Paraguay) -ISO-8859-1 +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: ISO-8859-1 OS Locale: es_SV -es_SV -Spanish (El Salvador) -ISO-8859-1 +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: ISO-8859-1 OS Locale: es_SV.ISO8859-1 -es_SV -Spanish (El Salvador) -ISO-8859-1 +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: ISO-8859-1 OS Locale: es_UY -es_UY -Spanish (Uruguay) -ISO-8859-1 +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: ISO-8859-1 OS Locale: es_UY.ISO8859-1 -es_UY -Spanish (Uruguay) -ISO-8859-1 +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: ISO-8859-1 OS Locale: es_VE -es_VE -Spanish (Venezuela) -ISO-8859-1 +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: ISO-8859-1 OS Locale: es_VE.ISO8859-1 -es_VE -Spanish (Venezuela) -ISO-8859-1 +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: ISO-8859-1 OS Locale: et -et_EE -Estonian (Estonia) -ISO-8859-15 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-15 OS Locale: et_EE -et_EE -Estonian (Estonia) -ISO-8859-15 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-15 OS Locale: et_EE.ISO8859-15 -et_EE -Estonian (Estonia) -ISO-8859-15 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-15 OS Locale: fi -fi_FI -Finnish (Finland) -ISO-8859-1 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 OS Locale: fi.ISO8859-15 -fi_FI -Finnish (Finland) -ISO-8859-15 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 OS Locale: fi_FI -fi_FI -Finnish (Finland) -ISO-8859-1 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 OS Locale: fi_FI.ISO8859-1 -fi_FI -Finnish (Finland) -ISO-8859-1 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 OS Locale: fi_FI.ISO8859-15 -fi_FI -Finnish (Finland) -ISO-8859-15 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 OS Locale: fi_FI.ISO8859-15@euro -fi_FI -Finnish (Finland) -ISO-8859-15 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 OS Locale: fi_FI.UTF-8 -fi_FI -Finnish (Finland) -UTF-8 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: UTF-8 OS Locale: fr -fr_FR -French (France) -ISO-8859-1 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 OS Locale: fr.ISO8859-15 -fr_FR -French (France) -ISO-8859-15 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 OS Locale: fr.UTF-8 -fr_FR -French (France) -UTF-8 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: UTF-8 OS Locale: fr_BE -fr_BE -French (Belgium) -ISO-8859-1 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-1 OS Locale: fr_BE.ISO8859-1 -fr_BE -French (Belgium) -ISO-8859-1 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-1 OS Locale: fr_BE.ISO8859-15 -fr_BE -French (Belgium) -ISO-8859-15 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-15 OS Locale: fr_BE.ISO8859-15@euro -fr_BE -French (Belgium) -ISO-8859-15 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-15 OS Locale: fr_BE.UTF-8 -fr_BE -French (Belgium) -UTF-8 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: UTF-8 OS Locale: fr_BE.UTF-8@euro -fr_BE -French (Belgium) -UTF-8 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: UTF-8 OS Locale: fr_CA -fr_CA -French (Canada) -ISO-8859-1 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: ISO-8859-1 OS Locale: fr_CA.ISO8859-1 -fr_CA -French (Canada) -ISO-8859-1 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: ISO-8859-1 + +OS Locale: fr_CA.UTF-8 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: UTF-8 OS Locale: fr_CH -fr_CH -French (Switzerland) -ISO-8859-1 +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: ISO-8859-1 OS Locale: fr_CH.ISO8859-1 -fr_CH -French (Switzerland) -ISO-8859-1 +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: ISO-8859-1 OS Locale: fr_FR -fr_FR -French (France) -ISO-8859-1 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 OS Locale: fr_FR.ISO8859-1 -fr_FR -French (France) -ISO-8859-1 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 OS Locale: fr_FR.ISO8859-15 -fr_FR -French (France) -ISO-8859-15 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 OS Locale: fr_FR.ISO8859-15@euro -fr_FR -French (France) -ISO-8859-15 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 OS Locale: fr_FR.UTF-8 -fr_FR -French (France) -UTF-8 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: UTF-8 OS Locale: fr_FR.UTF-8@euro -fr_FR -French (France) -UTF-8 - -OS Locale: geo -en -English -ISO-8859-1 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: UTF-8 OS Locale: he -iw_IL -Hebrew (Israel) -ISO-8859-8 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 OS Locale: he_IL -iw_IL -Hebrew (Israel) -ISO-8859-8 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 OS Locale: he_IL.UTF-8 -iw_IL -Hebrew (Israel) -UTF-8 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: UTF-8 OS Locale: hi_IN.UTF-8 -hi_IN -Hindi (India) -UTF-8 +default locale: ID: hi_IN, Name: Hindi (India) +display locale: ID: hi_IN, Name: Hindi (India) +format locale: ID: hi_IN, Name: Hindi (India) +default charset: UTF-8 OS Locale: hr_HR -hr_HR -Croatian (Croatia) -ISO-8859-2 +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 OS Locale: hr_HR.ISO8859-2 -hr_HR -Croatian (Croatia) -ISO-8859-2 +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 OS Locale: hu -hu_HU -Hungarian (Hungary) -ISO-8859-2 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 OS Locale: hu_HU -hu_HU -Hungarian (Hungary) -ISO-8859-2 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 OS Locale: hu_HU.ISO8859-2 -hu_HU -Hungarian (Hungary) -ISO-8859-2 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 OS Locale: hu_HU.UTF-8 -hu_HU -Hungarian (Hungary) -UTF-8 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: UTF-8 OS Locale: is_IS -is_IS -Icelandic (Iceland) -ISO-8859-1 +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 OS Locale: is_IS.ISO8859-1 -is_IS -Icelandic (Iceland) -ISO-8859-1 +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 OS Locale: iso_8859_1 -en_8859_1 -English (8859_1) -ISO-8859-1 - -OS Locale: iso_8859_13 -en -English -ISO-8859-1 - -OS Locale: iso_8859_15 -en -English -ISO-8859-1 - -OS Locale: iso_8859_2 -en -English -ISO-8859-1 - -OS Locale: iso_8859_5 -en -English -ISO-8859-1 - -OS Locale: iso_8859_7 -en -English -ISO-8859-1 - -OS Locale: iso_8859_9 -en -English -ISO-8859-1 +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: US-ASCII OS Locale: it -it_IT -Italian (Italy) -ISO-8859-1 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 OS Locale: it.ISO8859-15 -it_IT -Italian (Italy) -ISO-8859-15 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 OS Locale: it.UTF-8 -it_IT -Italian (Italy) -UTF-8 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: UTF-8 OS Locale: it_IT -it_IT -Italian (Italy) -ISO-8859-1 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 OS Locale: it_IT.ISO8859-1 -it_IT -Italian (Italy) -ISO-8859-1 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 OS Locale: it_IT.ISO8859-15 -it_IT -Italian (Italy) -ISO-8859-15 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 OS Locale: it_IT.ISO8859-15@euro -it_IT -Italian (Italy) -ISO-8859-15 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 OS Locale: it_IT.UTF-8 -it_IT -Italian (Italy) -UTF-8 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: UTF-8 OS Locale: it_IT.UTF-8@euro -it_IT -Italian (Italy) -UTF-8 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: UTF-8 OS Locale: ja -ja_JP -Japanese (Japan) -x-eucJP-Open +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-eucJP-Open OS Locale: ja_JP.PCK -ja_JP -Japanese (Japan) -x-PCK +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-PCK OS Locale: ja_JP.UTF-8 -ja_JP -Japanese (Japan) -UTF-8 +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: UTF-8 OS Locale: ja_JP.eucJP -ja_JP -Japanese (Japan) -x-eucJP-Open +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-eucJP-Open OS Locale: ko -ko_KR -Korean (South Korea) -EUC-KR +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR OS Locale: ko.UTF-8 -ko_KR -Korean (South Korea) -UTF-8 +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: UTF-8 OS Locale: ko_KR.EUC -ko_KR -Korean (South Korea) -EUC-KR +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR OS Locale: ko_KR.EUC@dict -ko_KR -Korean (South Korea) -EUC-KR +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR OS Locale: ko_KR.UTF-8 -ko_KR -Korean (South Korea) -UTF-8 +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: UTF-8 OS Locale: ko_KR.UTF-8@dict -ko_KR -Korean (South Korea) -UTF-8 - -OS Locale: lcttab -en -English -ISO-8859-1 +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: UTF-8 OS Locale: lt -lt_LT -Lithuanian (Lithuania) -ISO-8859-13 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 OS Locale: lt_LT -lt_LT -Lithuanian (Lithuania) -ISO-8859-13 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 OS Locale: lt_LT.ISO8859-13 -lt_LT -Lithuanian (Lithuania) -ISO-8859-13 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 OS Locale: lv -lv_LV -Latvian (Latvia) -ISO-8859-13 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 OS Locale: lv_LV -lv_LV -Latvian (Latvia) -ISO-8859-13 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 OS Locale: lv_LV.ISO8859-13 -lv_LV -Latvian (Latvia) -ISO-8859-13 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 OS Locale: mk_MK -mk_MK -Macedonian (Macedonia) -ISO-8859-5 +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: ISO-8859-5 OS Locale: mk_MK.ISO8859-5 -mk_MK -Macedonian (Macedonia) -ISO-8859-5 +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: ISO-8859-5 OS Locale: nl -nl_NL -Dutch (Netherlands) -ISO-8859-1 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 OS Locale: nl.ISO8859-15 -nl_NL -Dutch (Netherlands) -ISO-8859-15 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 OS Locale: nl_BE -nl_BE -Dutch (Belgium) -ISO-8859-1 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-1 OS Locale: nl_BE.ISO8859-1 -nl_BE -Dutch (Belgium) -ISO-8859-1 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-1 OS Locale: nl_BE.ISO8859-15 -nl_BE -Dutch (Belgium) -ISO-8859-15 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-15 OS Locale: nl_BE.ISO8859-15@euro -nl_BE -Dutch (Belgium) -ISO-8859-15 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-15 OS Locale: nl_NL -nl_NL -Dutch (Netherlands) -ISO-8859-1 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 OS Locale: nl_NL.ISO8859-1 -nl_NL -Dutch (Netherlands) -ISO-8859-1 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 OS Locale: nl_NL.ISO8859-15 -nl_NL -Dutch (Netherlands) -ISO-8859-15 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 OS Locale: nl_NL.ISO8859-15@euro -nl_NL -Dutch (Netherlands) -ISO-8859-15 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 OS Locale: no -no_NO -Norwegian (Norway) -ISO-8859-1 +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 OS Locale: no_NO -no_NO -Norwegian (Norway) -ISO-8859-1 +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 OS Locale: no_NO.ISO8859-1@bokmal -no_NO -Norwegian (Norway) -ISO-8859-1 +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 OS Locale: no_NO.ISO8859-1@nynorsk -no_NO_NY -Norwegian (Norway,Nynorsk) -ISO-8859-1 +default locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +display locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +default charset: ISO-8859-1 OS Locale: no_NY -no_NY -Norwegian (NY) -ISO-8859-1 +default locale: ID: no_, Name: Norwegian () +display locale: ID: no_, Name: Norwegian () +format locale: ID: no_, Name: Norwegian () +default charset: ISO-8859-1 OS Locale: nr -nr -South Ndebele -ISO-8859-2 +default locale: ID: nr, Name: South Ndebele +display locale: ID: nr, Name: South Ndebele +format locale: ID: nr, Name: South Ndebele +default charset: ISO-8859-2 OS Locale: pl -pl_PL -Polish (Poland) -ISO-8859-2 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 OS Locale: pl.UTF-8 -pl_PL -Polish (Poland) -UTF-8 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: UTF-8 OS Locale: pl_PL -pl_PL -Polish (Poland) -ISO-8859-2 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 OS Locale: pl_PL.ISO8859-2 -pl_PL -Polish (Poland) -ISO-8859-2 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 OS Locale: pl_PL.UTF-8 -pl_PL -Polish (Poland) -UTF-8 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: UTF-8 OS Locale: pt -pt_PT -Portuguese (Portugal) -ISO-8859-1 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 OS Locale: pt.ISO8859-15 -pt_PT -Portuguese (Portugal) -ISO-8859-15 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 OS Locale: pt_BR -pt_BR -Portuguese (Brazil) -ISO-8859-1 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: ISO-8859-1 OS Locale: pt_BR.ISO8859-1 -pt_BR -Portuguese (Brazil) -ISO-8859-1 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: ISO-8859-1 OS Locale: pt_BR.UTF-8 -pt_BR -Portuguese (Brazil) -UTF-8 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: UTF-8 OS Locale: pt_PT -pt_PT -Portuguese (Portugal) -ISO-8859-1 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 OS Locale: pt_PT.ISO8859-1 -pt_PT -Portuguese (Portugal) -ISO-8859-1 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 OS Locale: pt_PT.ISO8859-15 -pt_PT -Portuguese (Portugal) -ISO-8859-15 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 OS Locale: pt_PT.ISO8859-15@euro -pt_PT -Portuguese (Portugal) -ISO-8859-15 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 OS Locale: ro_RO -ro_RO -Romanian (Romania) -ISO-8859-2 +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 OS Locale: ro_RO.ISO8859-2 -ro_RO -Romanian (Romania) -ISO-8859-2 +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 OS Locale: ru -ru_RU -Russian (Russia) -ISO-8859-5 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 OS Locale: ru.UTF-8 -ru_RU -Russian (Russia) -UTF-8 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: UTF-8 OS Locale: ru.koi8-r -ru_RU -Russian (Russia) -KOI8-R +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: KOI8-R OS Locale: ru_RU -ru_RU -Russian (Russia) -ISO-8859-5 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 OS Locale: ru_RU.ANSI1251 -ru_RU -Russian (Russia) -windows-1251 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: windows-1251 OS Locale: ru_RU.ISO8859-5 -ru_RU -Russian (Russia) -ISO-8859-5 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 OS Locale: ru_RU.KOI8-R -ru_RU -Russian (Russia) -KOI8-R +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: KOI8-R OS Locale: ru_RU.UTF-8 -ru_RU -Russian (Russia) -UTF-8 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: UTF-8 OS Locale: sh_BA -sr_BA -Serbian (Bosnia and Herzegovina) -ISO-8859-2 +default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +display locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +default charset: ISO-8859-2 OS Locale: sh_BA.ISO8859-2@bosnia -sr_BA -Serbian (Bosnia and Herzegovina) -ISO-8859-2 +default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +display locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +default charset: ISO-8859-2 OS Locale: sk_SK -sk_SK -Slovak (Slovakia) -ISO-8859-2 +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 OS Locale: sk_SK.ISO8859-2 -sk_SK -Slovak (Slovakia) -ISO-8859-2 +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 OS Locale: sl_SI -sl_SI -Slovenian (Slovenia) -ISO-8859-2 +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 OS Locale: sl_SI.ISO8859-2 -sl_SI -Slovenian (Slovenia) -ISO-8859-2 +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 OS Locale: sq_AL -sq_AL -Albanian (Albania) -ISO-8859-2 +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: ISO-8859-2 OS Locale: sq_AL.ISO8859-2 -sq_AL -Albanian (Albania) -ISO-8859-2 +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: ISO-8859-2 OS Locale: sr_SP -sr_SP -Serbian (SP) -ISO-8859-5 +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: ISO-8859-5 OS Locale: sr_YU -sr_CS -Serbian (Serbia and Montenegro) -ISO-8859-5 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: ISO-8859-5 OS Locale: sr_YU.ISO8859-5 -sr_CS -Serbian (Serbia and Montenegro) -ISO-8859-5 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: ISO-8859-5 OS Locale: sv -sv_SE -Swedish (Sweden) -ISO-8859-1 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 OS Locale: sv.ISO8859-15 -sv_SE -Swedish (Sweden) -ISO-8859-15 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-15 OS Locale: sv.UTF-8 -sv_SE -Swedish (Sweden) -UTF-8 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: UTF-8 OS Locale: sv_SE -sv_SE -Swedish (Sweden) -ISO-8859-1 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 OS Locale: sv_SE.ISO8859-1 -sv_SE -Swedish (Sweden) -ISO-8859-1 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 OS Locale: sv_SE.ISO8859-15 -sv_SE -Swedish (Sweden) -ISO-8859-15 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-15 OS Locale: sv_SE.ISO8859-15@euro -sv_SE -Swedish (Sweden) -ISO-8859-15 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-15 OS Locale: sv_SE.UTF-8 -sv_SE -Swedish (Sweden) -UTF-8 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: UTF-8 OS Locale: sv_SE.UTF-8@euro -sv_SE -Swedish (Sweden) -UTF-8 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: UTF-8 OS Locale: th -th_TH -Thai (Thailand) -TIS-620 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 OS Locale: th_TH -th_TH -Thai (Thailand) -TIS-620 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 OS Locale: th_TH.ISO8859-11 -th_TH -Thai (Thailand) -TIS-620 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 OS Locale: th_TH.TIS620 -th_TH -Thai (Thailand) -TIS-620 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 OS Locale: th_TH.UTF-8 -th_TH -Thai (Thailand) -UTF-8 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: UTF-8 OS Locale: tr -tr_TR -Turkish (Turkey) -ISO-8859-9 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 OS Locale: tr_TR -tr_TR -Turkish (Turkey) -ISO-8859-9 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 OS Locale: tr_TR.ISO8859-9 -tr_TR -Turkish (Turkey) -ISO-8859-9 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 OS Locale: tr_TR.UTF-8 -tr_TR -Turkish (Turkey) -UTF-8 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: UTF-8 OS Locale: zh -zh_CN -Chinese (China) -GB2312 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 OS Locale: zh.GBK -zh_CN -Chinese (China) -GBK +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK OS Locale: zh.UTF-8 -zh_CN -Chinese (China) -UTF-8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 OS Locale: zh_CN.EUC -zh_CN -Chinese (China) -GB2312 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 OS Locale: zh_CN.EUC@pinyin -zh_CN -Chinese (China) -GB2312 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 OS Locale: zh_CN.EUC@radical -zh_CN -Chinese (China) -GB2312 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 OS Locale: zh_CN.EUC@stroke -zh_CN -Chinese (China) -GB2312 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 OS Locale: zh_CN.GB18030 -zh_CN -Chinese (China) -GB18030 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 OS Locale: zh_CN.GB18030@pinyin -zh_CN -Chinese (China) -GB18030 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 OS Locale: zh_CN.GB18030@radical -zh_CN -Chinese (China) -GB18030 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 OS Locale: zh_CN.GB18030@stroke -zh_CN -Chinese (China) -GB18030 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 OS Locale: zh_CN.GBK -zh_CN -Chinese (China) -GBK +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK OS Locale: zh_CN.GBK@pinyin -zh_CN -Chinese (China) -GBK +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK OS Locale: zh_CN.GBK@radical -zh_CN -Chinese (China) -GBK +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK OS Locale: zh_CN.GBK@stroke -zh_CN -Chinese (China) -GBK +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK OS Locale: zh_CN.UTF-8 -zh_CN -Chinese (China) -UTF-8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 OS Locale: zh_CN.UTF-8@pinyin -zh_CN -Chinese (China) -UTF-8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 OS Locale: zh_CN.UTF-8@radical -zh_CN -Chinese (China) -UTF-8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 OS Locale: zh_CN.UTF-8@stroke -zh_CN -Chinese (China) -UTF-8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 OS Locale: zh_HK.BIG5HK -zh_HK -Chinese (Hong Kong) -Big5-HKSCS +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-Big5-HKSCS-2001 OS Locale: zh_HK.BIG5HK@radical -zh_HK -Chinese (Hong Kong) -Big5-HKSCS +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-Big5-HKSCS-2001 OS Locale: zh_HK.BIG5HK@stroke -zh_HK -Chinese (Hong Kong) -Big5-HKSCS +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-Big5-HKSCS-2001 OS Locale: zh_HK.UTF-8 -zh_HK -Chinese (Hong Kong) -UTF-8 +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: UTF-8 OS Locale: zh_HK.UTF-8@radical -zh_HK -Chinese (Hong Kong) -UTF-8 +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: UTF-8 OS Locale: zh_HK.UTF-8@stroke -zh_HK -Chinese (Hong Kong) -UTF-8 +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: UTF-8 OS Locale: zh_TW -zh_TW -Chinese (Taiwan) -x-EUC-TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW OS Locale: zh_TW.BIG5 -zh_TW -Chinese (Taiwan) -Big5 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris OS Locale: zh_TW.BIG5@pinyin -zh_TW -Chinese (Taiwan) -Big5 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris OS Locale: zh_TW.BIG5@radical -zh_TW -Chinese (Taiwan) -Big5 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris OS Locale: zh_TW.BIG5@stroke -zh_TW -Chinese (Taiwan) -Big5 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris OS Locale: zh_TW.BIG5@zhuyin -zh_TW -Chinese (Taiwan) -Big5 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris OS Locale: zh_TW.EUC -zh_TW -Chinese (Taiwan) -x-EUC-TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW OS Locale: zh_TW.EUC@pinyin -zh_TW -Chinese (Taiwan) -x-EUC-TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW OS Locale: zh_TW.EUC@radical -zh_TW -Chinese (Taiwan) -x-EUC-TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW OS Locale: zh_TW.EUC@stroke -zh_TW -Chinese (Taiwan) -x-EUC-TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW OS Locale: zh_TW.EUC@zhuyin -zh_TW -Chinese (Taiwan) -x-EUC-TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW OS Locale: zh_TW.UTF-8 -zh_TW -Chinese (Taiwan) -UTF-8 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 OS Locale: zh_TW.UTF-8@pinyin -zh_TW -Chinese (Taiwan) -UTF-8 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 OS Locale: zh_TW.UTF-8@radical -zh_TW -Chinese (Taiwan) -UTF-8 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 OS Locale: zh_TW.UTF-8@stroke -zh_TW -Chinese (Taiwan) -UTF-8 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 OS Locale: zh_TW.UTF-8@zhuyin -zh_TW -Chinese (Taiwan) -UTF-8 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 + +Testing some typical combinations + + +OS Locale (LC_CTYPE: ja_JP.UTF-8, LC_MESSAGES: zh_CN.UTF-8) +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: UTF-8 + +OS Locale (LC_CTYPE: zh_CN.UTF-8, LC_MESSAGES: en_US.UTF-8) +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale (LC_CTYPE: C, LC_MESSAGES: zh_CN.UTF-8) +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: en, Name: English +default charset: US-ASCII diff --git a/jdk/test/java/util/Locale/data/deflocale.sol10.fmtasdefault b/jdk/test/java/util/Locale/data/deflocale.sol10.fmtasdefault new file mode 100644 index 00000000000..cea4b7e4430 --- /dev/null +++ b/jdk/test/java/util/Locale/data/deflocale.sol10.fmtasdefault @@ -0,0 +1,1725 @@ + Solaris 10 3/05 s10_74L2a SPARC + + (copyright from `uname -a` goes here) + +SunOS deltas4 5.10 Generic_142900-03 sun4u sparc SUNW,Sun-Blade-2500 +Testing all available locales + +OS Locale: C +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: US-ASCII + +OS Locale: POSIX +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: US-ASCII + +OS Locale: ar +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: ISO-8859-6 + +OS Locale: ar_EG.UTF-8 +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: ar_EG, Name: Arabic (Egypt) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: UTF-8 + +OS Locale: ar_SA.UTF-8 +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: UTF-8 + +OS Locale: bg_BG +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: ISO-8859-5 + +OS Locale: bg_BG.ISO8859-5 +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: ISO-8859-5 + +OS Locale: ca +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: ca_ES +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: ca_ES.ISO8859-1 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-1 + +OS Locale: ca_ES.ISO8859-15 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-15 + +OS Locale: ca_ES.ISO8859-15@euro +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: ca_ES, Name: Catalan (Spain) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: ISO-8859-15 + +OS Locale: cs_CZ +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: cs_CZ.ISO8859-2 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: cs_CZ.UTF-8 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: UTF-8 + +OS Locale: cs_CZ.UTF-8@euro +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: UTF-8 + +OS Locale: cz +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: cs_CZ, Name: Czech (Czech Republic) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: ISO-8859-2 + +OS Locale: da +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: da.ISO8859-15 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-15 + +OS Locale: da_DK +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: da_DK.ISO8859-1 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-1 + +OS Locale: da_DK.ISO8859-15 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-15 + +OS Locale: da_DK.ISO8859-15@euro +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: da_DK, Name: Danish (Denmark) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: ISO-8859-15 + +OS Locale: de +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: de.ISO8859-15 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 + +OS Locale: de.UTF-8 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: UTF-8 + +OS Locale: de_AT +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-1 + +OS Locale: de_AT.ISO8859-1 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-1 + +OS Locale: de_AT.ISO8859-15 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-15 + +OS Locale: de_AT.ISO8859-15@euro +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: de_AT, Name: German (Austria) +format locale: ID: de_AT, Name: German (Austria) +default charset: ISO-8859-15 + +OS Locale: de_CH +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: ISO-8859-1 + +OS Locale: de_CH.ISO8859-1 +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: de_CH, Name: German (Switzerland) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: ISO-8859-1 + +OS Locale: de_DE +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: de_DE.ISO8859-1 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-1 + +OS Locale: de_DE.ISO8859-15 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 + +OS Locale: de_DE.ISO8859-15@euro +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: ISO-8859-15 + +OS Locale: de_DE.UTF-8 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: UTF-8 + +OS Locale: de_DE.UTF-8@euro +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: de_DE, Name: German (Germany) +format locale: ID: de_DE, Name: German (Germany) +default charset: UTF-8 + +OS Locale: el +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: el.sun_eu_greek +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: el_GR +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: el_GR.ISO8859-7 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: el_GR.ISO8859-7@euro +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: el_GR, Name: Greek (Greece) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: ISO-8859-7 + +OS Locale: en_AU +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: ISO-8859-1 + +OS Locale: en_AU.ISO8859-1 +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: ISO-8859-1 + +OS Locale: en_CA +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: ISO-8859-1 + +OS Locale: en_CA.ISO8859-1 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: ISO-8859-1 + +OS Locale: en_CA.UTF-8 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: UTF-8 + +OS Locale: en_GB +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: en_GB.ISO8859-1 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-1 + +OS Locale: en_GB.ISO8859-15 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-15 + +OS Locale: en_GB.ISO8859-15@euro +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: ISO-8859-15 + +OS Locale: en_IE +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-1 + +OS Locale: en_IE.ISO8859-1 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-1 + +OS Locale: en_IE.ISO8859-15 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-15 + +OS Locale: en_IE.ISO8859-15@euro +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: ISO-8859-15 + +OS Locale: en_NZ +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: ISO-8859-1 + +OS Locale: en_NZ.ISO8859-1 +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: ISO-8859-1 + +OS Locale: en_US +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-1 + +OS Locale: en_US.ISO8859-1 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-1 + +OS Locale: en_US.ISO8859-15 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-15 + +OS Locale: en_US.ISO8859-15@euro +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: ISO-8859-15 + +OS Locale: en_US.UTF-8 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: UTF-8 + +OS Locale: es +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: es.ISO8859-15 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 + +OS Locale: es.UTF-8 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: UTF-8 + +OS Locale: es_AR +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: ISO-8859-1 + +OS Locale: es_AR.ISO8859-1 +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: es_AR, Name: Spanish (Argentina) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: ISO-8859-1 + +OS Locale: es_BO +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: ISO-8859-1 + +OS Locale: es_BO.ISO8859-1 +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: es_BO, Name: Spanish (Bolivia) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: ISO-8859-1 + +OS Locale: es_CL +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: ISO-8859-1 + +OS Locale: es_CL.ISO8859-1 +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: es_CL, Name: Spanish (Chile) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: ISO-8859-1 + +OS Locale: es_CO +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: ISO-8859-1 + +OS Locale: es_CO.ISO8859-1 +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: es_CO, Name: Spanish (Colombia) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: ISO-8859-1 + +OS Locale: es_CR +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: ISO-8859-1 + +OS Locale: es_CR.ISO8859-1 +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: es_CR, Name: Spanish (Costa Rica) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: ISO-8859-1 + +OS Locale: es_EC +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: ISO-8859-1 + +OS Locale: es_EC.ISO8859-1 +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: es_EC, Name: Spanish (Ecuador) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: ISO-8859-1 + +OS Locale: es_ES +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: es_ES.ISO8859-1 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-1 + +OS Locale: es_ES.ISO8859-15 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 + +OS Locale: es_ES.ISO8859-15@euro +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: ISO-8859-15 + +OS Locale: es_ES.UTF-8 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: UTF-8 + +OS Locale: es_ES.UTF-8@euro +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: es_ES, Name: Spanish (Spain) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: UTF-8 + +OS Locale: es_GT +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: ISO-8859-1 + +OS Locale: es_GT.ISO8859-1 +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: es_GT, Name: Spanish (Guatemala) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: ISO-8859-1 + +OS Locale: es_MX +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: ISO-8859-1 + +OS Locale: es_MX.ISO8859-1 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: ISO-8859-1 + +OS Locale: es_MX.UTF-8 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: es_MX, Name: Spanish (Mexico) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: UTF-8 + +OS Locale: es_NI +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: ISO-8859-1 + +OS Locale: es_NI.ISO8859-1 +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: es_NI, Name: Spanish (Nicaragua) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: ISO-8859-1 + +OS Locale: es_PA +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: ISO-8859-1 + +OS Locale: es_PA.ISO8859-1 +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: es_PA, Name: Spanish (Panama) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: ISO-8859-1 + +OS Locale: es_PE +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: ISO-8859-1 + +OS Locale: es_PE.ISO8859-1 +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: es_PE, Name: Spanish (Peru) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: ISO-8859-1 + +OS Locale: es_PY +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: ISO-8859-1 + +OS Locale: es_PY.ISO8859-1 +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: es_PY, Name: Spanish (Paraguay) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: ISO-8859-1 + +OS Locale: es_SV +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: ISO-8859-1 + +OS Locale: es_SV.ISO8859-1 +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: es_SV, Name: Spanish (El Salvador) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: ISO-8859-1 + +OS Locale: es_UY +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: ISO-8859-1 + +OS Locale: es_UY.ISO8859-1 +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: es_UY, Name: Spanish (Uruguay) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: ISO-8859-1 + +OS Locale: es_VE +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: ISO-8859-1 + +OS Locale: es_VE.ISO8859-1 +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: es_VE, Name: Spanish (Venezuela) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: ISO-8859-1 + +OS Locale: et +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-15 + +OS Locale: et_EE +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-15 + +OS Locale: et_EE.ISO8859-15 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: et_EE, Name: Estonian (Estonia) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: ISO-8859-15 + +OS Locale: fi +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fi.ISO8859-15 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 + +OS Locale: fi_FI +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fi_FI.ISO8859-1 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-1 + +OS Locale: fi_FI.ISO8859-15 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 + +OS Locale: fi_FI.ISO8859-15@euro +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: ISO-8859-15 + +OS Locale: fi_FI.UTF-8 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: fi_FI, Name: Finnish (Finland) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: UTF-8 + +OS Locale: fr +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fr.ISO8859-15 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 + +OS Locale: fr.UTF-8 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: UTF-8 + +OS Locale: fr_BE +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-1 + +OS Locale: fr_BE.ISO8859-1 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-1 + +OS Locale: fr_BE.ISO8859-15 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-15 + +OS Locale: fr_BE.ISO8859-15@euro +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: ISO-8859-15 + +OS Locale: fr_BE.UTF-8 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: UTF-8 + +OS Locale: fr_BE.UTF-8@euro +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: fr_BE, Name: French (Belgium) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: UTF-8 + +OS Locale: fr_CA +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: ISO-8859-1 + +OS Locale: fr_CA.ISO8859-1 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: ISO-8859-1 + +OS Locale: fr_CA.UTF-8 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: fr_CA, Name: French (Canada) +format locale: ID: fr_CA, Name: French (Canada) +default charset: UTF-8 + +OS Locale: fr_CH +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: ISO-8859-1 + +OS Locale: fr_CH.ISO8859-1 +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: fr_CH, Name: French (Switzerland) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: ISO-8859-1 + +OS Locale: fr_FR +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fr_FR.ISO8859-1 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-1 + +OS Locale: fr_FR.ISO8859-15 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 + +OS Locale: fr_FR.ISO8859-15@euro +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: ISO-8859-15 + +OS Locale: fr_FR.UTF-8 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: UTF-8 + +OS Locale: fr_FR.UTF-8@euro +default locale: ID: fr_FR, Name: French (France) +display locale: ID: fr_FR, Name: French (France) +format locale: ID: fr_FR, Name: French (France) +default charset: UTF-8 + +OS Locale: he +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: he_IL +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: ISO-8859-8 + +OS Locale: he_IL.UTF-8 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: iw_IL, Name: Hebrew (Israel) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: UTF-8 + +OS Locale: hi_IN.UTF-8 +default locale: ID: hi_IN, Name: Hindi (India) +display locale: ID: hi_IN, Name: Hindi (India) +format locale: ID: hi_IN, Name: Hindi (India) +default charset: UTF-8 + +OS Locale: hr_HR +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: hr_HR.ISO8859-2 +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: hr_HR, Name: Croatian (Croatia) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: ISO-8859-2 + +OS Locale: hu +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hu_HU +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hu_HU.ISO8859-2 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: ISO-8859-2 + +OS Locale: hu_HU.UTF-8 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: hu_HU, Name: Hungarian (Hungary) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: UTF-8 + +OS Locale: is_IS +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 + +OS Locale: is_IS.ISO8859-1 +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: is_IS, Name: Icelandic (Iceland) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: ISO-8859-1 + +OS Locale: iso_8859_1 +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: US-ASCII + +OS Locale: it +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: it.ISO8859-15 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 + +OS Locale: it.UTF-8 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: UTF-8 + +OS Locale: it_IT +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: it_IT.ISO8859-1 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-1 + +OS Locale: it_IT.ISO8859-15 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 + +OS Locale: it_IT.ISO8859-15@euro +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: ISO-8859-15 + +OS Locale: it_IT.UTF-8 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: UTF-8 + +OS Locale: it_IT.UTF-8@euro +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: it_IT, Name: Italian (Italy) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: UTF-8 + +OS Locale: ja +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-eucJP-Open + +OS Locale: ja_JP.PCK +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-PCK + +OS Locale: ja_JP.UTF-8 +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: UTF-8 + +OS Locale: ja_JP.eucJP +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: x-eucJP-Open + +OS Locale: ko +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR + +OS Locale: ko.UTF-8 +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: UTF-8 + +OS Locale: ko_KR.EUC +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR + +OS Locale: ko_KR.EUC@dict +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: EUC-KR + +OS Locale: ko_KR.UTF-8 +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: UTF-8 + +OS Locale: ko_KR.UTF-8@dict +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: ko_KR, Name: Korean (South Korea) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: UTF-8 + +OS Locale: lt +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 + +OS Locale: lt_LT +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 + +OS Locale: lt_LT.ISO8859-13 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: lt_LT, Name: Lithuanian (Lithuania) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: ISO-8859-13 + +OS Locale: lv +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 + +OS Locale: lv_LV +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 + +OS Locale: lv_LV.ISO8859-13 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: lv_LV, Name: Latvian (Latvia) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: ISO-8859-13 + +OS Locale: mk_MK +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: ISO-8859-5 + +OS Locale: mk_MK.ISO8859-5 +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: mk_MK, Name: Macedonian (Macedonia) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: ISO-8859-5 + +OS Locale: nl +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: nl.ISO8859-15 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 + +OS Locale: nl_BE +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-1 + +OS Locale: nl_BE.ISO8859-1 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-1 + +OS Locale: nl_BE.ISO8859-15 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-15 + +OS Locale: nl_BE.ISO8859-15@euro +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: nl_BE, Name: Dutch (Belgium) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: ISO-8859-15 + +OS Locale: nl_NL +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: nl_NL.ISO8859-1 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-1 + +OS Locale: nl_NL.ISO8859-15 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 + +OS Locale: nl_NL.ISO8859-15@euro +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: nl_NL, Name: Dutch (Netherlands) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: ISO-8859-15 + +OS Locale: no +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: no_NO +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: no_NO.ISO8859-1@bokmal +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: no_NO, Name: Norwegian (Norway) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: ISO-8859-1 + +OS Locale: no_NO.ISO8859-1@nynorsk +default locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +display locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +default charset: ISO-8859-1 + +OS Locale: no_NY +default locale: ID: no_, Name: Norwegian () +display locale: ID: no_, Name: Norwegian () +format locale: ID: no_, Name: Norwegian () +default charset: ISO-8859-1 + +OS Locale: nr +default locale: ID: nr, Name: South Ndebele +display locale: ID: nr, Name: South Ndebele +format locale: ID: nr, Name: South Ndebele +default charset: ISO-8859-2 + +OS Locale: pl +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: pl.UTF-8 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: UTF-8 + +OS Locale: pl_PL +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: pl_PL.ISO8859-2 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: ISO-8859-2 + +OS Locale: pl_PL.UTF-8 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: pl_PL, Name: Polish (Poland) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: UTF-8 + +OS Locale: pt +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt.ISO8859-15 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 + +OS Locale: pt_BR +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: ISO-8859-1 + +OS Locale: pt_BR.ISO8859-1 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: ISO-8859-1 + +OS Locale: pt_BR.UTF-8 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: pt_BR, Name: Portuguese (Brazil) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: UTF-8 + +OS Locale: pt_PT +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt_PT.ISO8859-1 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-1 + +OS Locale: pt_PT.ISO8859-15 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 + +OS Locale: pt_PT.ISO8859-15@euro +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: pt_PT, Name: Portuguese (Portugal) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: ISO-8859-15 + +OS Locale: ro_RO +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 + +OS Locale: ro_RO.ISO8859-2 +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: ro_RO, Name: Romanian (Romania) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: ISO-8859-2 + +OS Locale: ru +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: ru.UTF-8 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: UTF-8 + +OS Locale: ru.koi8-r +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: KOI8-R + +OS Locale: ru_RU +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: ru_RU.ANSI1251 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: windows-1251 + +OS Locale: ru_RU.ISO8859-5 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: ISO-8859-5 + +OS Locale: ru_RU.KOI8-R +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: KOI8-R + +OS Locale: ru_RU.UTF-8 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: ru_RU, Name: Russian (Russia) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: UTF-8 + +OS Locale: sh_BA +default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +display locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +default charset: ISO-8859-2 + +OS Locale: sh_BA.ISO8859-2@bosnia +default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +display locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +default charset: ISO-8859-2 + +OS Locale: sk_SK +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 + +OS Locale: sk_SK.ISO8859-2 +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: sk_SK, Name: Slovak (Slovakia) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: ISO-8859-2 + +OS Locale: sl_SI +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: sl_SI.ISO8859-2 +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: sl_SI, Name: Slovenian (Slovenia) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: ISO-8859-2 + +OS Locale: sq_AL +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: ISO-8859-2 + +OS Locale: sq_AL.ISO8859-2 +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: sq_AL, Name: Albanian (Albania) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: ISO-8859-2 + +OS Locale: sr_SP +default locale: ID: sr, Name: Serbian +display locale: ID: sr, Name: Serbian +format locale: ID: sr, Name: Serbian +default charset: ISO-8859-5 + +OS Locale: sr_YU +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: ISO-8859-5 + +OS Locale: sr_YU.ISO8859-5 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: ISO-8859-5 + +OS Locale: sv +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: sv.ISO8859-15 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-15 + +OS Locale: sv.UTF-8 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: UTF-8 + +OS Locale: sv_SE +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: sv_SE.ISO8859-1 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-1 + +OS Locale: sv_SE.ISO8859-15 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-15 + +OS Locale: sv_SE.ISO8859-15@euro +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: ISO-8859-15 + +OS Locale: sv_SE.UTF-8 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: UTF-8 + +OS Locale: sv_SE.UTF-8@euro +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: sv_SE, Name: Swedish (Sweden) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: UTF-8 + +OS Locale: th +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 + +OS Locale: th_TH +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 + +OS Locale: th_TH.ISO8859-11 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 + +OS Locale: th_TH.TIS620 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: TIS-620 + +OS Locale: th_TH.UTF-8 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: th_TH, Name: Thai (Thailand) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: UTF-8 + +OS Locale: tr +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: tr_TR +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: tr_TR.ISO8859-9 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: ISO-8859-9 + +OS Locale: tr_TR.UTF-8 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: tr_TR, Name: Turkish (Turkey) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: UTF-8 + +OS Locale: zh +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh.GBK +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale: zh.UTF-8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale: zh_CN.EUC +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh_CN.EUC@pinyin +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh_CN.EUC@radical +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh_CN.EUC@stroke +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB2312 + +OS Locale: zh_CN.GB18030 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 + +OS Locale: zh_CN.GB18030@pinyin +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 + +OS Locale: zh_CN.GB18030@radical +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 + +OS Locale: zh_CN.GB18030@stroke +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GB18030 + +OS Locale: zh_CN.GBK +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale: zh_CN.GBK@pinyin +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale: zh_CN.GBK@radical +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale: zh_CN.GBK@stroke +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale: zh_CN.UTF-8 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale: zh_CN.UTF-8@pinyin +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale: zh_CN.UTF-8@radical +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale: zh_CN.UTF-8@stroke +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale: zh_HK.BIG5HK +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-Big5-HKSCS-2001 + +OS Locale: zh_HK.BIG5HK@radical +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-Big5-HKSCS-2001 + +OS Locale: zh_HK.BIG5HK@stroke +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-Big5-HKSCS-2001 + +OS Locale: zh_HK.UTF-8 +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: UTF-8 + +OS Locale: zh_HK.UTF-8@radical +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: UTF-8 + +OS Locale: zh_HK.UTF-8@stroke +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: zh_HK, Name: Chinese (Hong Kong) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: UTF-8 + +OS Locale: zh_TW +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW + +OS Locale: zh_TW.BIG5 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris + +OS Locale: zh_TW.BIG5@pinyin +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris + +OS Locale: zh_TW.BIG5@radical +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris + +OS Locale: zh_TW.BIG5@stroke +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris + +OS Locale: zh_TW.BIG5@zhuyin +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-Big5-Solaris + +OS Locale: zh_TW.EUC +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW + +OS Locale: zh_TW.EUC@pinyin +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW + +OS Locale: zh_TW.EUC@radical +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW + +OS Locale: zh_TW.EUC@stroke +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW + +OS Locale: zh_TW.EUC@zhuyin +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-EUC-TW + +OS Locale: zh_TW.UTF-8 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 + +OS Locale: zh_TW.UTF-8@pinyin +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 + +OS Locale: zh_TW.UTF-8@radical +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 + +OS Locale: zh_TW.UTF-8@stroke +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 + +OS Locale: zh_TW.UTF-8@zhuyin +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: zh_TW, Name: Chinese (Taiwan) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: UTF-8 + +Testing some typical combinations + + +OS Locale (LC_CTYPE: ja_JP.UTF-8, LC_MESSAGES: zh_CN.UTF-8) +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: UTF-8 + +OS Locale (LC_CTYPE: zh_CN.UTF-8, LC_MESSAGES: en_US.UTF-8) +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: UTF-8 + +OS Locale (LC_CTYPE: C, LC_MESSAGES: zh_CN.UTF-8) +default locale: ID: en, Name: English +display locale: ID: zh_CN, Name: Chinese (China) +format locale: ID: en, Name: English +default charset: US-ASCII diff --git a/jdk/test/java/util/Locale/data/deflocale.win7 b/jdk/test/java/util/Locale/data/deflocale.win7 new file mode 100644 index 00000000000..9eb68e4b702 --- /dev/null +++ b/jdk/test/java/util/Locale/data/deflocale.win7 @@ -0,0 +1,1494 @@ +# OSVersionInfo +# MajorVersion: 6 +# MinorVersion: 1 +# BuildNumber: 7600 +# CSDVersion: + + +OS Locale (lcid: 7f, name: ): Invariant Language (Invariant Country) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 401, name: ar-SA): Arabic (Saudi Arabia) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: windows-1252 + +OS Locale (lcid: 402, name: bg-BG): Bulgarian (Bulgaria) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: windows-1252 + +OS Locale (lcid: 403, name: ca-ES): Catalan (Spain) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: windows-1252 + +OS Locale (lcid: 404, name: zh-TW): Chinese (Traditional) (Taiwan) - 950 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: windows-1252 + +OS Locale (lcid: 405, name: cs-CZ): Czech (Czech Republic) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: windows-1252 + +OS Locale (lcid: 406, name: da-DK): Danish (Denmark) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: windows-1252 + +OS Locale (lcid: 407, name: de-DE): German (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_DE, Name: German (Germany) +default charset: windows-1252 + +OS Locale (lcid: 408, name: el-GR): Greek (Greece) - 1253 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: windows-1252 + +OS Locale (lcid: 409, name: en-US): English (United States) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 40b, name: fi-FI): Finnish (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: windows-1252 + +OS Locale (lcid: 40c, name: fr-FR): French (France) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_FR, Name: French (France) +default charset: windows-1252 + +OS Locale (lcid: 40d, name: he-IL): Hebrew (Israel) - 1255 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: windows-1252 + +OS Locale (lcid: 40e, name: hu-HU): Hungarian (Hungary) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: windows-1252 + +OS Locale (lcid: 40f, name: is-IS): Icelandic (Iceland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: windows-1252 + +OS Locale (lcid: 410, name: it-IT): Italian (Italy) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: windows-1252 + +OS Locale (lcid: 411, name: ja-JP): Japanese (Japan) - 932 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: windows-1252 + +OS Locale (lcid: 412, name: ko-KR): Korean (Korea) - 949 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: windows-1252 + +OS Locale (lcid: 413, name: nl-NL): Dutch (Netherlands) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: windows-1252 + +OS Locale (lcid: 414, name: nb-NO): Norwegian (Bokmål) (Norway) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: windows-1252 + +OS Locale (lcid: 415, name: pl-PL): Polish (Poland) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: windows-1252 + +OS Locale (lcid: 416, name: pt-BR): Portuguese (Brazil) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: windows-1252 + +OS Locale (lcid: 417, name: rm-CH): Romansh (Switzerland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: rm_CH, Name: Raeto-Romance (Switzerland) +default charset: windows-1252 + +OS Locale (lcid: 418, name: ro-RO): Romanian (Romania) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: windows-1252 + +OS Locale (lcid: 419, name: ru-RU): Russian (Russia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: windows-1252 + +OS Locale (lcid: 41a, name: hr-HR): Croatian (Croatia) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: windows-1252 + +OS Locale (lcid: 41b, name: sk-SK): Slovak (Slovakia) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: windows-1252 + +OS Locale (lcid: 41c, name: sq-AL): Albanian (Albania) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: windows-1252 + +OS Locale (lcid: 41d, name: sv-SE): Swedish (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: windows-1252 + +OS Locale (lcid: 41e, name: th-TH): Thai (Thailand) - 874 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: windows-1252 + +OS Locale (lcid: 41f, name: tr-TR): Turkish (Turkey) - 1254 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: windows-1252 + +OS Locale (lcid: 420, name: ur-PK): Urdu (Islamic Republic of Pakistan) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ur_PK, Name: Urdu (Pakistan) +default charset: windows-1252 + +OS Locale (lcid: 421, name: id-ID): Indonesian (Indonesia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: in_ID, Name: Indonesian (Indonesia) +default charset: windows-1252 + +OS Locale (lcid: 422, name: uk-UA): Ukrainian (Ukraine) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uk_UA, Name: Ukrainian (Ukraine) +default charset: windows-1252 + +OS Locale (lcid: 423, name: be-BY): Belarusian (Belarus) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: windows-1252 + +OS Locale (lcid: 424, name: sl-SI): Slovenian (Slovenia) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: windows-1252 + +OS Locale (lcid: 425, name: et-EE): Estonian (Estonia) - 1257 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: windows-1252 + +OS Locale (lcid: 426, name: lv-LV): Latvian (Latvia) - 1257 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: windows-1252 + +OS Locale (lcid: 427, name: lt-LT): Lithuanian (Lithuania) - 1257 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: windows-1252 + +OS Locale (lcid: 428, name: tg-Cyrl-TJ): Tajik (Cyrillic) (Tajikistan) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: windows-1252 + +OS Locale (lcid: 428, name: tg-Cyrl): Tajik (Cyrillic) (Tajikistan) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: windows-1252 + +OS Locale (lcid: 429, name: fa-IR): Persian (Iran) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fa_IR, Name: Persian (Iran) +default charset: windows-1252 + +OS Locale (lcid: 42a, name: vi-VN): Vietnamese (Vietnam) - 1258 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: vi_VN, Name: Vietnamese (Vietnam) +default charset: windows-1252 + +OS Locale (lcid: 42b, name: hy-AM): Armenian (Armenia) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hy_AM, Name: Armenian (Armenia) +default charset: windows-1252 + +OS Locale (lcid: 42c, name: az-Latn-AZ): Azeri (Latin) (Azerbaijan) - 1254 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: windows-1252 + +OS Locale (lcid: 42c, name: az-Latn): Azeri (Latin) (Azerbaijan) - 1254 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: windows-1252 + +OS Locale (lcid: 42d, name: eu-ES): Basque (Spain) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: windows-1252 + +OS Locale (lcid: 42e, name: hsb-DE): Upper Sorbian (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 42e, name: hsb): Upper Sorbian (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 42f, name: mk-MK): Macedonian (FYROM) (Macedonia (FYROM)) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: windows-1252 + +OS Locale (lcid: 432, name: tn-ZA): Setswana (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tn_ZA, Name: Tswana (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 434, name: xh-ZA): isiXhosa (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: xh_ZA, Name: Xhosa (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 435, name: zu-ZA): isiZulu (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zu_ZA, Name: Zulu (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 436, name: af-ZA): Afrikaans (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: af_ZA, Name: Afrikaans (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 437, name: ka-GE): Georgian (Georgia) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ka_GE, Name: Georgian (Georgia) +default charset: windows-1252 + +OS Locale (lcid: 438, name: fo-FO): Faroese (Faroe Islands) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fo_FO, Name: Faroese (Faroe Islands) +default charset: windows-1252 + +OS Locale (lcid: 439, name: hi-IN): Hindi (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hi_IN, Name: Hindi (India) +default charset: windows-1252 + +OS Locale (lcid: 43a, name: mt-MT): Maltese (Malta) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mt_MT, Name: Maltese (Malta) +default charset: windows-1252 + +OS Locale (lcid: 43b, name: se-NO): Sami (Northern) (Norway) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: se_NO, Name: Northern Sami (Norway) +default charset: windows-1252 + +OS Locale (lcid: 43e, name: ms-MY): Malay (Malaysia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ms_MY, Name: Malay (Malaysia) +default charset: windows-1252 + +OS Locale (lcid: 43f, name: kk-KZ): Kazakh (Kazakhstan) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +default charset: windows-1252 + +OS Locale (lcid: 440, name: ky-KG): Kyrgyz (Kyrgyzstan) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +default charset: windows-1252 + +OS Locale (lcid: 441, name: sw-KE): Kiswahili (Kenya) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sw_KE, Name: Swahili (Kenya) +default charset: windows-1252 + +OS Locale (lcid: 442, name: tk-TM): Turkmen (Turkmenistan) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tk_TM, Name: Turkmen (Turkmenistan) +default charset: windows-1252 + +OS Locale (lcid: 443, name: uz-Latn): Uzbek (Latin) (Uzbekistan) - 1254 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: windows-1252 + +OS Locale (lcid: 443, name: uz-Latn-UZ): Uzbek (Latin) (Uzbekistan) - 1254 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: windows-1252 + +OS Locale (lcid: 444, name: tt-RU): Tatar (Russia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tt_RU, Name: Tatar (Russia) +default charset: windows-1252 + +OS Locale (lcid: 445, name: bn-IN): Bengali (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bn_IN, Name: Bengali (India) +default charset: windows-1252 + +OS Locale (lcid: 446, name: pa-IN): Punjabi (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: pa_IN, Name: Panjabi (India) +default charset: windows-1252 + +OS Locale (lcid: 447, name: gu-IN): Gujarati (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: gu_IN, Name: Gujarati (India) +default charset: windows-1252 + +OS Locale (lcid: 448, name: or-IN): Oriya (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: or_IN, Name: Oriya (India) +default charset: windows-1252 + +OS Locale (lcid: 449, name: ta-IN): Tamil (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ta_IN, Name: Tamil (India) +default charset: windows-1252 + +OS Locale (lcid: 44a, name: te-IN): Telugu (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: te_IN, Name: Telugu (India) +default charset: windows-1252 + +OS Locale (lcid: 44b, name: kn-IN): Kannada (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: kn_IN, Name: Kannada (India) +default charset: windows-1252 + +OS Locale (lcid: 44c, name: ml-IN): Malayalam (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ml_IN, Name: Malayalam (India) +default charset: windows-1252 + +OS Locale (lcid: 44d, name: as-IN): Assamese (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: as_IN, Name: Assamese (India) +default charset: windows-1252 + +OS Locale (lcid: 44e, name: mr-IN): Marathi (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mr_IN, Name: Marathi (India) +default charset: windows-1252 + +OS Locale (lcid: 44f, name: sa-IN): Sanskrit (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sa_IN, Name: Sanskrit (India) +default charset: windows-1252 + +OS Locale (lcid: 450, name: mn-MN): Mongolian (Cyrillic) (Mongolia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mn_MN, Name: Mongolian (Mongolia) +default charset: windows-1252 + +OS Locale (lcid: 450, name: mn-Cyrl): Mongolian (Cyrillic) (Mongolia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mn_MN, Name: Mongolian (Mongolia) +default charset: windows-1252 + +OS Locale (lcid: 451, name: bo-CN): Tibetan (People's Republic of China) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bo_CN, Name: Tibetan (China) +default charset: windows-1252 + +OS Locale (lcid: 452, name: cy-GB): Welsh (United Kingdom) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: cy_GB, Name: Welsh (United Kingdom) +default charset: windows-1252 + +OS Locale (lcid: 453, name: km-KH): Khmer (Cambodia) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: km_KH, Name: Khmer (Cambodia) +default charset: windows-1252 + +OS Locale (lcid: 454, name: lo-LA): Lao (Lao P.D.R.) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: lo_LA, Name: Lao (Laos) +default charset: windows-1252 + +OS Locale (lcid: 456, name: gl-ES): Galician (Spain) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: windows-1252 + +OS Locale (lcid: 457, name: kok-IN): Konkani (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 457, name: kok): Konkani (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 45a, name: syr): Syriac (Syria) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 45a, name: syr-SY): Syriac (Syria) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 45b, name: si-LK): Sinhala (Sri Lanka) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +default charset: windows-1252 + +OS Locale (lcid: 45d, name: iu-Cans-CA): Inuktitut (Syllabics) (Canada) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iu_CA, Name: Inuktitut (Canada) +default charset: windows-1252 + +OS Locale (lcid: 45d, name: iu-Cans): Inuktitut (Syllabics) (Canada) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iu_CA, Name: Inuktitut (Canada) +default charset: windows-1252 + +OS Locale (lcid: 45e, name: am-ET): Amharic (Ethiopia) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: am_ET, Name: Amharic (Ethiopia) +default charset: windows-1252 + +OS Locale (lcid: 461, name: ne-NP): Nepali (Nepal) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ne_NP, Name: Nepali (Nepal) +default charset: windows-1252 + +OS Locale (lcid: 462, name: fy-NL): Frisian (Netherlands) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fy_NL, Name: Frisian (Netherlands) +default charset: windows-1252 + +OS Locale (lcid: 463, name: ps-AF): Pashto (Afghanistan) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ps_AF, Name: Pushto (Afghanistan) +default charset: windows-1252 + +OS Locale (lcid: 464, name: fil-PH): Filipino (Philippines) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 464, name: fil): Filipino (Philippines) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 465, name: dv-MV): Divehi (Maldives) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: dv_MV, Name: Divehi (Maldives) +default charset: windows-1252 + +OS Locale (lcid: 468, name: ha-Latn-NG): Hausa (Latin) (Nigeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ha_NG, Name: Hausa (Nigeria) +default charset: windows-1252 + +OS Locale (lcid: 468, name: ha-Latn): Hausa (Latin) (Nigeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ha_NG, Name: Hausa (Nigeria) +default charset: windows-1252 + +OS Locale (lcid: 46a, name: yo-NG): Yoruba (Nigeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: yo_NG, Name: Yoruba (Nigeria) +default charset: windows-1252 + +OS Locale (lcid: 46b, name: quz): Quechua (Bolivia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 46b, name: quz-BO): Quechua (Bolivia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 46c, name: nso): Sesotho sa Leboa (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 46c, name: nso-ZA): Sesotho sa Leboa (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 46d, name: ba-RU): Bashkir (Russia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ba_RU, Name: Bashkir (Russia) +default charset: windows-1252 + +OS Locale (lcid: 46e, name: lb-LU): Luxembourgish (Luxembourg) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: lb_LU, Name: Luxembourgish (Luxembourg) +default charset: windows-1252 + +OS Locale (lcid: 46f, name: kl-GL): Greenlandic (Greenland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: kl_GL, Name: Greenlandic (Greenland) +default charset: windows-1252 + +OS Locale (lcid: 470, name: ig-NG): Igbo (Nigeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ig_NG, Name: Igbo (Nigeria) +default charset: windows-1252 + +OS Locale (lcid: 478, name: ii-CN): Yi (People's Republic of China) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ii_CN, Name: Sichuan Yi (China) +default charset: windows-1252 + +OS Locale (lcid: 47a, name: arn): Mapudungun (Chile) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 47a, name: arn-CL): Mapudungun (Chile) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 47c, name: moh): Mohawk (Canada) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 47c, name: moh-CA): Mohawk (Canada) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 47e, name: br-FR): Breton (France) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: br_FR, Name: Breton (France) +default charset: windows-1252 + +OS Locale (lcid: 480, name: ug-CN): Uyghur (People's Republic of China) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ug_CN, Name: Uighur (China) +default charset: windows-1252 + +OS Locale (lcid: 481, name: mi-NZ): Maori (New Zealand) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mi_NZ, Name: Maori (New Zealand) +default charset: windows-1252 + +OS Locale (lcid: 482, name: oc-FR): Occitan (France) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: oc_FR, Name: Occitan (France) +default charset: windows-1252 + +OS Locale (lcid: 483, name: co-FR): Corsican (France) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: co_FR, Name: Corsican (France) +default charset: windows-1252 + +OS Locale (lcid: 484, name: gsw): Alsatian (France) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 484, name: gsw-FR): Alsatian (France) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 485, name: sah): Yakut (Russia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 485, name: sah-RU): Yakut (Russia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 486, name: qut): K'iche (Guatemala) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 486, name: qut-GT): K'iche (Guatemala) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 487, name: rw-RW): Kinyarwanda (Rwanda) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +default charset: windows-1252 + +OS Locale (lcid: 488, name: wo-SN): Wolof (Senegal) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: wo_SN, Name: Wolof (Senegal) +default charset: windows-1252 + +OS Locale (lcid: 48c, name: prs): Dari (Afghanistan) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 48c, name: prs-AF): Dari (Afghanistan) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 491, name: gd-GB): Scottish Gaelic (United Kingdom) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +default charset: windows-1252 + +OS Locale (lcid: 801, name: ar-IQ): Arabic (Iraq) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_IQ, Name: Arabic (Iraq) +default charset: windows-1252 + +OS Locale (lcid: 804, name: zh-Hans): Chinese (Simplified) (People's Republic of China) - 936 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: windows-1252 + +OS Locale (lcid: 804, name: zh-CN): Chinese (Simplified) (People's Republic of China) - 936 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: windows-1252 + +OS Locale (lcid: 807, name: de-CH): German (Switzerland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: windows-1252 + +OS Locale (lcid: 809, name: en-GB): English (United Kingdom) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 80a, name: es-MX): Spanish (Mexico) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: windows-1252 + +OS Locale (lcid: 80c, name: fr-BE): French (Belgium) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: windows-1252 + +OS Locale (lcid: 810, name: it-CH): Italian (Switzerland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: it_CH, Name: Italian (Switzerland) +default charset: windows-1252 + +OS Locale (lcid: 813, name: nl-BE): Dutch (Belgium) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: windows-1252 + +OS Locale (lcid: 814, name: nn-NO): Norwegian (Nynorsk) (Norway) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +default charset: windows-1252 + +OS Locale (lcid: 816, name: pt-PT): Portuguese (Portugal) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: windows-1252 + +OS Locale (lcid: 81a, name: sr-Latn-CS): Serbian (Latin) (Serbia and Montenegro (Former)) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: windows-1252 + +OS Locale (lcid: 81d, name: sv-FI): Swedish (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: windows-1252 + +OS Locale (lcid: 82c, name: az-Cyrl-AZ): Azeri (Cyrillic) (Azerbaijan) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: windows-1252 + +OS Locale (lcid: 82c, name: az-Cyrl): Azeri (Cyrillic) (Azerbaijan) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: windows-1252 + +OS Locale (lcid: 82e, name: dsb): Lower Sorbian (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 82e, name: dsb-DE): Lower Sorbian (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 83b, name: se-SE): Sami (Northern) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: se_SE, Name: Northern Sami (Sweden) +default charset: windows-1252 + +OS Locale (lcid: 83c, name: ga-IE): Irish (Ireland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: windows-1252 + +OS Locale (lcid: 83e, name: ms-BN): Malay (Brunei Darussalam) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ms_BN, Name: Malay (Brunei) +default charset: windows-1252 + +OS Locale (lcid: 843, name: uz-Cyrl-UZ): Uzbek (Cyrillic) (Uzbekistan) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: windows-1252 + +OS Locale (lcid: 843, name: uz-Cyrl): Uzbek (Cyrillic) (Uzbekistan) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: windows-1252 + +OS Locale (lcid: 845, name: bn-BD): Bengali (Bangladesh) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bn_BD, Name: Bengali (Bangladesh) +default charset: windows-1252 + +OS Locale (lcid: 850, name: mn-Mong-CN): Mongolian (Traditional Mongolian) (People's Republic of China) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mn_CN, Name: Mongolian (China) +default charset: windows-1252 + +OS Locale (lcid: 850, name: mn-Mong): Mongolian (Traditional Mongolian) (People's Republic of China) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mn_CN, Name: Mongolian (China) +default charset: windows-1252 + +OS Locale (lcid: 85d, name: iu-Latn): Inuktitut (Latin) (Canada) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iu_CA, Name: Inuktitut (Canada) +default charset: windows-1252 + +OS Locale (lcid: 85d, name: iu-Latn-CA): Inuktitut (Latin) (Canada) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iu_CA, Name: Inuktitut (Canada) +default charset: windows-1252 + +OS Locale (lcid: 85f, name: tzm): Tamazight (Latin) (Algeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 85f, name: tzm-Latn-DZ): Tamazight (Latin) (Algeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 85f, name: tzm-Latn): Tamazight (Latin) (Algeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 86b, name: quz-EC): Quechua (Ecuador) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: c01, name: ar-EG): Arabic (Egypt) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: windows-1252 + +OS Locale (lcid: c04, name: zh-HK): Chinese (Traditional) (Hong Kong S.A.R.) - 950 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-MS950-HKSCS + +OS Locale (lcid: c04, name: zh-Hant): Chinese (Traditional) (Hong Kong S.A.R.) - 950 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: windows-1252 + +OS Locale (lcid: c07, name: de-AT): German (Austria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_AT, Name: German (Austria) +default charset: windows-1252 + +OS Locale (lcid: c09, name: en-AU): English (Australia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: c0a, name: es-ES): Spanish (Spain) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: windows-1252 + +OS Locale (lcid: c0c, name: fr-CA): French (Canada) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_CA, Name: French (Canada) +default charset: windows-1252 + +OS Locale (lcid: c1a, name: sr-Cyrl-CS): Serbian (Cyrillic) (Serbia and Montenegro (Former)) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: windows-1252 + +OS Locale (lcid: c3b, name: se-FI): Sami (Northern) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: se_FI, Name: Northern Sami (Finland) +default charset: windows-1252 + +OS Locale (lcid: c6b, name: quz-PE): Quechua (Peru) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1001, name: ar-LY): Arabic (Libya) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_LY, Name: Arabic (Libya) +default charset: windows-1252 + +OS Locale (lcid: 1004, name: zh-SG): Chinese (Simplified) (Singapore) - 936 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: windows-1252 + +OS Locale (lcid: 1007, name: de-LU): German (Luxembourg) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: windows-1252 + +OS Locale (lcid: 1009, name: en-CA): English (Canada) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 100a, name: es-GT): Spanish (Guatemala) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: windows-1252 + +OS Locale (lcid: 100c, name: fr-CH): French (Switzerland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: windows-1252 + +OS Locale (lcid: 101a, name: hr-BA): Croatian (Latin) (Bosnia and Herzegovina) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hr_BA, Name: Croatian (Bosnia and Herzegovina) +default charset: windows-1252 + +OS Locale (lcid: 103b, name: smj-NO): Sami (Lule) (Norway) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1401, name: ar-DZ): Arabic (Algeria) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_DZ, Name: Arabic (Algeria) +default charset: windows-1252 + +OS Locale (lcid: 1404, name: zh-MO): Chinese (Traditional) (Macao S.A.R.) - 950 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_MO, Name: Chinese (Macao) +default charset: windows-1252 + +OS Locale (lcid: 1407, name: de-LI): German (Liechtenstein) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_LI, Name: German (Liechtenstein) +default charset: windows-1252 + +OS Locale (lcid: 1409, name: en-NZ): English (New Zealand) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 140a, name: es-CR): Spanish (Costa Rica) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: windows-1252 + +OS Locale (lcid: 140c, name: fr-LU): French (Luxembourg) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: windows-1252 + +OS Locale (lcid: 141a, name: bs-Latn): Bosnian (Latin) (Bosnia and Herzegovina) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: windows-1252 + +OS Locale (lcid: 141a, name: bs-Latn-BA): Bosnian (Latin) (Bosnia and Herzegovina) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: windows-1252 + +OS Locale (lcid: 143b, name: smj-SE): Sami (Lule) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 143b, name: smj): Sami (Lule) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1801, name: ar-MA): Arabic (Morocco) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_MA, Name: Arabic (Morocco) +default charset: windows-1252 + +OS Locale (lcid: 1809, name: en-IE): English (Ireland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 180a, name: es-PA): Spanish (Panama) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: windows-1252 + +OS Locale (lcid: 180c, name: fr-MC): French (Principality of Monaco) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_MC, Name: French (Monaco) +default charset: windows-1252 + +OS Locale (lcid: 181a, name: sr-Latn-BA): Serbian (Latin) (Bosnia and Herzegovina) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +default charset: windows-1252 + +OS Locale (lcid: 183b, name: sma-NO): Sami (Southern) (Norway) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1c01, name: ar-TN): Arabic (Tunisia) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_TN, Name: Arabic (Tunisia) +default charset: windows-1252 + +OS Locale (lcid: 1c09, name: en-ZA): English (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1c0a, name: es-DO): Spanish (Dominican Republic) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_DO, Name: Spanish (Dominican Republic) +default charset: windows-1252 + +OS Locale (lcid: 1c1a, name: sr-Cyrl-BA): Serbian (Cyrillic) (Bosnia and Herzegovina) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +default charset: windows-1252 + +OS Locale (lcid: 1c3b, name: sma): Sami (Southern) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1c3b, name: sma-SE): Sami (Southern) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 2001, name: ar-OM): Arabic (Oman) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_OM, Name: Arabic (Oman) +default charset: windows-1252 + +OS Locale (lcid: 2009, name: en-JM): English (Jamaica) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 200a, name: es-VE): Spanish (Bolivarian Republic of Venezuela) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: windows-1252 + +OS Locale (lcid: 201a, name: bs-Cyrl-BA): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: windows-1252 + +OS Locale (lcid: 201a, name: bs-Cyrl): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: windows-1252 + +OS Locale (lcid: 203b, name: sms-FI): Sami (Skolt) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 203b, name: sms): Sami (Skolt) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 2401, name: ar-YE): Arabic (Yemen) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_YE, Name: Arabic (Yemen) +default charset: windows-1252 + +OS Locale (lcid: 2409, name: en-029): English (Caribbean) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 240a, name: es-CO): Spanish (Colombia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: windows-1252 + +OS Locale (lcid: 241a, name: sr-Latn-RS): Serbian (Latin) (Serbia) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_RS, Name: Serbian (Serbia) +default charset: windows-1252 + +OS Locale (lcid: 241a, name: sr-Latn): Serbian (Latin) (Serbia) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_RS, Name: Serbian (Serbia) +default charset: windows-1252 + +OS Locale (lcid: 243b, name: smn): Sami (Inari) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 243b, name: smn-FI): Sami (Inari) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 2801, name: ar-SY): Arabic (Syria) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_SY, Name: Arabic (Syria) +default charset: windows-1252 + +OS Locale (lcid: 2809, name: en-BZ): English (Belize) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 280a, name: es-PE): Spanish (Peru) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: windows-1252 + +OS Locale (lcid: 281a, name: sr-Cyrl-RS): Serbian (Cyrillic) (Serbia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_RS, Name: Serbian (Serbia) +default charset: windows-1252 + +OS Locale (lcid: 281a, name: sr-Cyrl): Serbian (Cyrillic) (Serbia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_RS, Name: Serbian (Serbia) +default charset: windows-1252 + +OS Locale (lcid: 2c01, name: ar-JO): Arabic (Jordan) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_JO, Name: Arabic (Jordan) +default charset: windows-1252 + +OS Locale (lcid: 2c09, name: en-TT): English (Trinidad and Tobago) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 2c0a, name: es-AR): Spanish (Argentina) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: windows-1252 + +OS Locale (lcid: 2c1a, name: sr-Latn-ME): Serbian (Latin) (Montenegro) - 1250 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_ME, Name: Serbian (Montenegro) +default charset: windows-1252 + +OS Locale (lcid: 3001, name: ar-LB): Arabic (Lebanon) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_LB, Name: Arabic (Lebanon) +default charset: windows-1252 + +OS Locale (lcid: 3009, name: en-ZW): English (Zimbabwe) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 300a, name: es-EC): Spanish (Ecuador) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: windows-1252 + +OS Locale (lcid: 301a, name: sr-Cyrl-ME): Serbian (Cyrillic) (Montenegro) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_ME, Name: Serbian (Montenegro) +default charset: windows-1252 + +OS Locale (lcid: 3401, name: ar-KW): Arabic (Kuwait) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_KW, Name: Arabic (Kuwait) +default charset: windows-1252 + +OS Locale (lcid: 3409, name: en-PH): English (Republic of the Philippines) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 340a, name: es-CL): Spanish (Chile) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: windows-1252 + +OS Locale (lcid: 3801, name: ar-AE): Arabic (U.A.E.) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +default charset: windows-1252 + +OS Locale (lcid: 380a, name: es-UY): Spanish (Uruguay) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: windows-1252 + +OS Locale (lcid: 3c01, name: ar-BH): Arabic (Bahrain) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_BH, Name: Arabic (Bahrain) +default charset: windows-1252 + +OS Locale (lcid: 3c0a, name: es-PY): Spanish (Paraguay) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: windows-1252 + +OS Locale (lcid: 4001, name: ar-QA): Arabic (Qatar) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_QA, Name: Arabic (Qatar) +default charset: windows-1252 + +OS Locale (lcid: 4009, name: en-IN): English (India) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 400a, name: es-BO): Spanish (Bolivia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: windows-1252 + +OS Locale (lcid: 4409, name: en-MY): English (Malaysia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 440a, name: es-SV): Spanish (El Salvador) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: windows-1252 + +OS Locale (lcid: 4809, name: en-SG): English (Singapore) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 480a, name: es-HN): Spanish (Honduras) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_HN, Name: Spanish (Honduras) +default charset: windows-1252 + +OS Locale (lcid: 4c0a, name: es-NI): Spanish (Nicaragua) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: windows-1252 + +OS Locale (lcid: 500a, name: es-PR): Spanish (Puerto Rico) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_PR, Name: Spanish (Puerto Rico) +default charset: windows-1252 + +OS Locale (lcid: 540a, name: es-US): Spanish (United States) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es, Name: Spanish +default charset: windows-1252 + +OS UI Language (name: en-US) +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS UI Language (name: ja-JP) +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 diff --git a/jdk/test/java/util/Locale/data/deflocale.win7.fmtasdefault b/jdk/test/java/util/Locale/data/deflocale.win7.fmtasdefault new file mode 100644 index 00000000000..d5a8656a15d --- /dev/null +++ b/jdk/test/java/util/Locale/data/deflocale.win7.fmtasdefault @@ -0,0 +1,1494 @@ +# OSVersionInfo +# MajorVersion: 6 +# MinorVersion: 1 +# BuildNumber: 7600 +# CSDVersion: + + +OS Locale (lcid: 7f, name: ): Invariant Language (Invariant Country) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 401, name: ar-SA): Arabic (Saudi Arabia) - 1256 +default locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_SA, Name: Arabic (Saudi Arabia) +default charset: windows-1256 + +OS Locale (lcid: 402, name: bg-BG): Bulgarian (Bulgaria) - 1251 +default locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bg_BG, Name: Bulgarian (Bulgaria) +default charset: windows-1251 + +OS Locale (lcid: 403, name: ca-ES): Catalan (Spain) - 1252 +default locale: ID: ca_ES, Name: Catalan (Spain) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ca_ES, Name: Catalan (Spain) +default charset: windows-1252 + +OS Locale (lcid: 404, name: zh-TW): Chinese (Traditional) (Taiwan) - 950 +default locale: ID: zh_TW, Name: Chinese (Taiwan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_TW, Name: Chinese (Taiwan) +default charset: x-windows-950 + +OS Locale (lcid: 405, name: cs-CZ): Czech (Czech Republic) - 1250 +default locale: ID: cs_CZ, Name: Czech (Czech Republic) +display locale: ID: en_US, Name: English (United States) +format locale: ID: cs_CZ, Name: Czech (Czech Republic) +default charset: windows-1250 + +OS Locale (lcid: 406, name: da-DK): Danish (Denmark) - 1252 +default locale: ID: da_DK, Name: Danish (Denmark) +display locale: ID: en_US, Name: English (United States) +format locale: ID: da_DK, Name: Danish (Denmark) +default charset: windows-1252 + +OS Locale (lcid: 407, name: de-DE): German (Germany) - 1252 +default locale: ID: de_DE, Name: German (Germany) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_DE, Name: German (Germany) +default charset: windows-1252 + +OS Locale (lcid: 408, name: el-GR): Greek (Greece) - 1253 +default locale: ID: el_GR, Name: Greek (Greece) +display locale: ID: en_US, Name: English (United States) +format locale: ID: el_GR, Name: Greek (Greece) +default charset: windows-1253 + +OS Locale (lcid: 409, name: en-US): English (United States) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 40b, name: fi-FI): Finnish (Finland) - 1252 +default locale: ID: fi_FI, Name: Finnish (Finland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fi_FI, Name: Finnish (Finland) +default charset: windows-1252 + +OS Locale (lcid: 40c, name: fr-FR): French (France) - 1252 +default locale: ID: fr_FR, Name: French (France) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_FR, Name: French (France) +default charset: windows-1252 + +OS Locale (lcid: 40d, name: he-IL): Hebrew (Israel) - 1255 +default locale: ID: iw_IL, Name: Hebrew (Israel) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iw_IL, Name: Hebrew (Israel) +default charset: windows-1255 + +OS Locale (lcid: 40e, name: hu-HU): Hungarian (Hungary) - 1250 +default locale: ID: hu_HU, Name: Hungarian (Hungary) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hu_HU, Name: Hungarian (Hungary) +default charset: windows-1250 + +OS Locale (lcid: 40f, name: is-IS): Icelandic (Iceland) - 1252 +default locale: ID: is_IS, Name: Icelandic (Iceland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: is_IS, Name: Icelandic (Iceland) +default charset: windows-1252 + +OS Locale (lcid: 410, name: it-IT): Italian (Italy) - 1252 +default locale: ID: it_IT, Name: Italian (Italy) +display locale: ID: en_US, Name: English (United States) +format locale: ID: it_IT, Name: Italian (Italy) +default charset: windows-1252 + +OS Locale (lcid: 411, name: ja-JP): Japanese (Japan) - 932 +default locale: ID: ja_JP, Name: Japanese (Japan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ja_JP, Name: Japanese (Japan) +default charset: windows-31j + +OS Locale (lcid: 412, name: ko-KR): Korean (Korea) - 949 +default locale: ID: ko_KR, Name: Korean (South Korea) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ko_KR, Name: Korean (South Korea) +default charset: x-windows-949 + +OS Locale (lcid: 413, name: nl-NL): Dutch (Netherlands) - 1252 +default locale: ID: nl_NL, Name: Dutch (Netherlands) +display locale: ID: en_US, Name: English (United States) +format locale: ID: nl_NL, Name: Dutch (Netherlands) +default charset: windows-1252 + +OS Locale (lcid: 414, name: nb-NO): Norwegian (Bokmål) (Norway) - 1252 +default locale: ID: no_NO, Name: Norwegian (Norway) +display locale: ID: en_US, Name: English (United States) +format locale: ID: no_NO, Name: Norwegian (Norway) +default charset: windows-1252 + +OS Locale (lcid: 415, name: pl-PL): Polish (Poland) - 1250 +default locale: ID: pl_PL, Name: Polish (Poland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: pl_PL, Name: Polish (Poland) +default charset: windows-1250 + +OS Locale (lcid: 416, name: pt-BR): Portuguese (Brazil) - 1252 +default locale: ID: pt_BR, Name: Portuguese (Brazil) +display locale: ID: en_US, Name: English (United States) +format locale: ID: pt_BR, Name: Portuguese (Brazil) +default charset: windows-1252 + +OS Locale (lcid: 417, name: rm-CH): Romansh (Switzerland) - 1252 +default locale: ID: rm_CH, Name: Raeto-Romance (Switzerland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: rm_CH, Name: Raeto-Romance (Switzerland) +default charset: windows-1252 + +OS Locale (lcid: 418, name: ro-RO): Romanian (Romania) - 1250 +default locale: ID: ro_RO, Name: Romanian (Romania) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ro_RO, Name: Romanian (Romania) +default charset: windows-1250 + +OS Locale (lcid: 419, name: ru-RU): Russian (Russia) - 1251 +default locale: ID: ru_RU, Name: Russian (Russia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ru_RU, Name: Russian (Russia) +default charset: windows-1251 + +OS Locale (lcid: 41a, name: hr-HR): Croatian (Croatia) - 1250 +default locale: ID: hr_HR, Name: Croatian (Croatia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hr_HR, Name: Croatian (Croatia) +default charset: windows-1250 + +OS Locale (lcid: 41b, name: sk-SK): Slovak (Slovakia) - 1250 +default locale: ID: sk_SK, Name: Slovak (Slovakia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sk_SK, Name: Slovak (Slovakia) +default charset: windows-1250 + +OS Locale (lcid: 41c, name: sq-AL): Albanian (Albania) - 1250 +default locale: ID: sq_AL, Name: Albanian (Albania) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sq_AL, Name: Albanian (Albania) +default charset: windows-1250 + +OS Locale (lcid: 41d, name: sv-SE): Swedish (Sweden) - 1252 +default locale: ID: sv_SE, Name: Swedish (Sweden) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sv_SE, Name: Swedish (Sweden) +default charset: windows-1252 + +OS Locale (lcid: 41e, name: th-TH): Thai (Thailand) - 874 +default locale: ID: th_TH, Name: Thai (Thailand) +display locale: ID: en_US, Name: English (United States) +format locale: ID: th_TH, Name: Thai (Thailand) +default charset: x-windows-874 + +OS Locale (lcid: 41f, name: tr-TR): Turkish (Turkey) - 1254 +default locale: ID: tr_TR, Name: Turkish (Turkey) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tr_TR, Name: Turkish (Turkey) +default charset: windows-1254 + +OS Locale (lcid: 420, name: ur-PK): Urdu (Islamic Republic of Pakistan) - 1256 +default locale: ID: ur_PK, Name: Urdu (Pakistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ur_PK, Name: Urdu (Pakistan) +default charset: windows-1256 + +OS Locale (lcid: 421, name: id-ID): Indonesian (Indonesia) - 1252 +default locale: ID: in_ID, Name: Indonesian (Indonesia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: in_ID, Name: Indonesian (Indonesia) +default charset: windows-1252 + +OS Locale (lcid: 422, name: uk-UA): Ukrainian (Ukraine) - 1251 +default locale: ID: uk_UA, Name: Ukrainian (Ukraine) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uk_UA, Name: Ukrainian (Ukraine) +default charset: windows-1251 + +OS Locale (lcid: 423, name: be-BY): Belarusian (Belarus) - 1251 +default locale: ID: be_BY, Name: Belarusian (Belarus) +display locale: ID: en_US, Name: English (United States) +format locale: ID: be_BY, Name: Belarusian (Belarus) +default charset: windows-1251 + +OS Locale (lcid: 424, name: sl-SI): Slovenian (Slovenia) - 1250 +default locale: ID: sl_SI, Name: Slovenian (Slovenia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sl_SI, Name: Slovenian (Slovenia) +default charset: windows-1250 + +OS Locale (lcid: 425, name: et-EE): Estonian (Estonia) - 1257 +default locale: ID: et_EE, Name: Estonian (Estonia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: et_EE, Name: Estonian (Estonia) +default charset: windows-1257 + +OS Locale (lcid: 426, name: lv-LV): Latvian (Latvia) - 1257 +default locale: ID: lv_LV, Name: Latvian (Latvia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: lv_LV, Name: Latvian (Latvia) +default charset: windows-1257 + +OS Locale (lcid: 427, name: lt-LT): Lithuanian (Lithuania) - 1257 +default locale: ID: lt_LT, Name: Lithuanian (Lithuania) +display locale: ID: en_US, Name: English (United States) +format locale: ID: lt_LT, Name: Lithuanian (Lithuania) +default charset: windows-1257 + +OS Locale (lcid: 428, name: tg-Cyrl-TJ): Tajik (Cyrillic) (Tajikistan) - 1251 +default locale: ID: tg_TJ, Name: Tajik (Tajikistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: windows-1251 + +OS Locale (lcid: 428, name: tg-Cyrl): Tajik (Cyrillic) (Tajikistan) - 1251 +default locale: ID: tg_TJ, Name: Tajik (Tajikistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tg_TJ, Name: Tajik (Tajikistan) +default charset: windows-1251 + +OS Locale (lcid: 429, name: fa-IR): Persian (Iran) - 1256 +default locale: ID: fa_IR, Name: Persian (Iran) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fa_IR, Name: Persian (Iran) +default charset: windows-1256 + +OS Locale (lcid: 42a, name: vi-VN): Vietnamese (Vietnam) - 1258 +default locale: ID: vi_VN, Name: Vietnamese (Vietnam) +display locale: ID: en_US, Name: English (United States) +format locale: ID: vi_VN, Name: Vietnamese (Vietnam) +default charset: windows-1258 + +OS Locale (lcid: 42b, name: hy-AM): Armenian (Armenia) - 0 +default locale: ID: hy_AM, Name: Armenian (Armenia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hy_AM, Name: Armenian (Armenia) +default charset: UTF-8 + +OS Locale (lcid: 42c, name: az-Latn-AZ): Azeri (Latin) (Azerbaijan) - 1254 +default locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: windows-1254 + +OS Locale (lcid: 42c, name: az-Latn): Azeri (Latin) (Azerbaijan) - 1254 +default locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: windows-1254 + +OS Locale (lcid: 42d, name: eu-ES): Basque (Spain) - 1252 +default locale: ID: eu_ES, Name: Basque (Spain) +display locale: ID: en_US, Name: English (United States) +format locale: ID: eu_ES, Name: Basque (Spain) +default charset: windows-1252 + +OS Locale (lcid: 42e, name: hsb-DE): Upper Sorbian (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 42e, name: hsb): Upper Sorbian (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 42f, name: mk-MK): Macedonian (FYROM) (Macedonia (FYROM)) - 1251 +default locale: ID: mk_MK, Name: Macedonian (Macedonia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mk_MK, Name: Macedonian (Macedonia) +default charset: windows-1251 + +OS Locale (lcid: 432, name: tn-ZA): Setswana (South Africa) - 1252 +default locale: ID: tn_ZA, Name: Tswana (South Africa) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tn_ZA, Name: Tswana (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 434, name: xh-ZA): isiXhosa (South Africa) - 1252 +default locale: ID: xh_ZA, Name: Xhosa (South Africa) +display locale: ID: en_US, Name: English (United States) +format locale: ID: xh_ZA, Name: Xhosa (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 435, name: zu-ZA): isiZulu (South Africa) - 1252 +default locale: ID: zu_ZA, Name: Zulu (South Africa) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zu_ZA, Name: Zulu (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 436, name: af-ZA): Afrikaans (South Africa) - 1252 +default locale: ID: af_ZA, Name: Afrikaans (South Africa) +display locale: ID: en_US, Name: English (United States) +format locale: ID: af_ZA, Name: Afrikaans (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 437, name: ka-GE): Georgian (Georgia) - 0 +default locale: ID: ka_GE, Name: Georgian (Georgia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ka_GE, Name: Georgian (Georgia) +default charset: UTF-8 + +OS Locale (lcid: 438, name: fo-FO): Faroese (Faroe Islands) - 1252 +default locale: ID: fo_FO, Name: Faroese (Faroe Islands) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fo_FO, Name: Faroese (Faroe Islands) +default charset: windows-1252 + +OS Locale (lcid: 439, name: hi-IN): Hindi (India) - 0 +default locale: ID: hi_IN, Name: Hindi (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hi_IN, Name: Hindi (India) +default charset: UTF-8 + +OS Locale (lcid: 43a, name: mt-MT): Maltese (Malta) - 0 +default locale: ID: mt_MT, Name: Maltese (Malta) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mt_MT, Name: Maltese (Malta) +default charset: UTF-8 + +OS Locale (lcid: 43b, name: se-NO): Sami (Northern) (Norway) - 1252 +default locale: ID: se_NO, Name: Northern Sami (Norway) +display locale: ID: en_US, Name: English (United States) +format locale: ID: se_NO, Name: Northern Sami (Norway) +default charset: windows-1252 + +OS Locale (lcid: 43e, name: ms-MY): Malay (Malaysia) - 1252 +default locale: ID: ms_MY, Name: Malay (Malaysia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ms_MY, Name: Malay (Malaysia) +default charset: windows-1252 + +OS Locale (lcid: 43f, name: kk-KZ): Kazakh (Kazakhstan) - 0 +default locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: kk_KZ, Name: Kazakh (Kazakhstan) +default charset: UTF-8 + +OS Locale (lcid: 440, name: ky-KG): Kyrgyz (Kyrgyzstan) - 1251 +default locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ky_KG, Name: Kirghiz (Kyrgyzstan) +default charset: windows-1251 + +OS Locale (lcid: 441, name: sw-KE): Kiswahili (Kenya) - 1252 +default locale: ID: sw_KE, Name: Swahili (Kenya) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sw_KE, Name: Swahili (Kenya) +default charset: windows-1252 + +OS Locale (lcid: 442, name: tk-TM): Turkmen (Turkmenistan) - 1250 +default locale: ID: tk_TM, Name: Turkmen (Turkmenistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tk_TM, Name: Turkmen (Turkmenistan) +default charset: windows-1250 + +OS Locale (lcid: 443, name: uz-Latn): Uzbek (Latin) (Uzbekistan) - 1254 +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: windows-1254 + +OS Locale (lcid: 443, name: uz-Latn-UZ): Uzbek (Latin) (Uzbekistan) - 1254 +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: windows-1254 + +OS Locale (lcid: 444, name: tt-RU): Tatar (Russia) - 1251 +default locale: ID: tt_RU, Name: Tatar (Russia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: tt_RU, Name: Tatar (Russia) +default charset: windows-1251 + +OS Locale (lcid: 445, name: bn-IN): Bengali (India) - 0 +default locale: ID: bn_IN, Name: Bengali (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bn_IN, Name: Bengali (India) +default charset: UTF-8 + +OS Locale (lcid: 446, name: pa-IN): Punjabi (India) - 0 +default locale: ID: pa_IN, Name: Panjabi (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: pa_IN, Name: Panjabi (India) +default charset: UTF-8 + +OS Locale (lcid: 447, name: gu-IN): Gujarati (India) - 0 +default locale: ID: gu_IN, Name: Gujarati (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: gu_IN, Name: Gujarati (India) +default charset: UTF-8 + +OS Locale (lcid: 448, name: or-IN): Oriya (India) - 0 +default locale: ID: or_IN, Name: Oriya (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: or_IN, Name: Oriya (India) +default charset: UTF-8 + +OS Locale (lcid: 449, name: ta-IN): Tamil (India) - 0 +default locale: ID: ta_IN, Name: Tamil (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ta_IN, Name: Tamil (India) +default charset: UTF-8 + +OS Locale (lcid: 44a, name: te-IN): Telugu (India) - 0 +default locale: ID: te_IN, Name: Telugu (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: te_IN, Name: Telugu (India) +default charset: UTF-8 + +OS Locale (lcid: 44b, name: kn-IN): Kannada (India) - 0 +default locale: ID: kn_IN, Name: Kannada (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: kn_IN, Name: Kannada (India) +default charset: UTF-8 + +OS Locale (lcid: 44c, name: ml-IN): Malayalam (India) - 0 +default locale: ID: ml_IN, Name: Malayalam (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ml_IN, Name: Malayalam (India) +default charset: UTF-8 + +OS Locale (lcid: 44d, name: as-IN): Assamese (India) - 0 +default locale: ID: as_IN, Name: Assamese (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: as_IN, Name: Assamese (India) +default charset: UTF-8 + +OS Locale (lcid: 44e, name: mr-IN): Marathi (India) - 0 +default locale: ID: mr_IN, Name: Marathi (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mr_IN, Name: Marathi (India) +default charset: UTF-8 + +OS Locale (lcid: 44f, name: sa-IN): Sanskrit (India) - 0 +default locale: ID: sa_IN, Name: Sanskrit (India) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sa_IN, Name: Sanskrit (India) +default charset: UTF-8 + +OS Locale (lcid: 450, name: mn-MN): Mongolian (Cyrillic) (Mongolia) - 1251 +default locale: ID: mn_MN, Name: Mongolian (Mongolia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mn_MN, Name: Mongolian (Mongolia) +default charset: windows-1251 + +OS Locale (lcid: 450, name: mn-Cyrl): Mongolian (Cyrillic) (Mongolia) - 1251 +default locale: ID: mn_MN, Name: Mongolian (Mongolia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mn_MN, Name: Mongolian (Mongolia) +default charset: windows-1251 + +OS Locale (lcid: 451, name: bo-CN): Tibetan (People's Republic of China) - 0 +default locale: ID: bo_CN, Name: Tibetan (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bo_CN, Name: Tibetan (China) +default charset: UTF-8 + +OS Locale (lcid: 452, name: cy-GB): Welsh (United Kingdom) - 1252 +default locale: ID: cy_GB, Name: Welsh (United Kingdom) +display locale: ID: en_US, Name: English (United States) +format locale: ID: cy_GB, Name: Welsh (United Kingdom) +default charset: windows-1252 + +OS Locale (lcid: 453, name: km-KH): Khmer (Cambodia) - 0 +default locale: ID: km_KH, Name: Khmer (Cambodia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: km_KH, Name: Khmer (Cambodia) +default charset: UTF-8 + +OS Locale (lcid: 454, name: lo-LA): Lao (Lao P.D.R.) - 0 +default locale: ID: lo_LA, Name: Lao (Laos) +display locale: ID: en_US, Name: English (United States) +format locale: ID: lo_LA, Name: Lao (Laos) +default charset: UTF-8 + +OS Locale (lcid: 456, name: gl-ES): Galician (Spain) - 1252 +default locale: ID: gl_ES, Name: Gallegan (Spain) +display locale: ID: en_US, Name: English (United States) +format locale: ID: gl_ES, Name: Gallegan (Spain) +default charset: windows-1252 + +OS Locale (lcid: 457, name: kok-IN): Konkani (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: UTF-8 + +OS Locale (lcid: 457, name: kok): Konkani (India) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: UTF-8 + +OS Locale (lcid: 45a, name: syr): Syriac (Syria) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: UTF-8 + +OS Locale (lcid: 45a, name: syr-SY): Syriac (Syria) - 0 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: UTF-8 + +OS Locale (lcid: 45b, name: si-LK): Sinhala (Sri Lanka) - 0 +default locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +display locale: ID: en_US, Name: English (United States) +format locale: ID: si_LK, Name: Sinhalese (Sri Lanka) +default charset: UTF-8 + +OS Locale (lcid: 45d, name: iu-Cans-CA): Inuktitut (Syllabics) (Canada) - 0 +default locale: ID: iu_CA, Name: Inuktitut (Canada) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iu_CA, Name: Inuktitut (Canada) +default charset: UTF-8 + +OS Locale (lcid: 45d, name: iu-Cans): Inuktitut (Syllabics) (Canada) - 0 +default locale: ID: iu_CA, Name: Inuktitut (Canada) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iu_CA, Name: Inuktitut (Canada) +default charset: UTF-8 + +OS Locale (lcid: 45e, name: am-ET): Amharic (Ethiopia) - 0 +default locale: ID: am_ET, Name: Amharic (Ethiopia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: am_ET, Name: Amharic (Ethiopia) +default charset: UTF-8 + +OS Locale (lcid: 461, name: ne-NP): Nepali (Nepal) - 0 +default locale: ID: ne_NP, Name: Nepali (Nepal) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ne_NP, Name: Nepali (Nepal) +default charset: UTF-8 + +OS Locale (lcid: 462, name: fy-NL): Frisian (Netherlands) - 1252 +default locale: ID: fy_NL, Name: Frisian (Netherlands) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fy_NL, Name: Frisian (Netherlands) +default charset: windows-1252 + +OS Locale (lcid: 463, name: ps-AF): Pashto (Afghanistan) - 0 +default locale: ID: ps_AF, Name: Pushto (Afghanistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ps_AF, Name: Pushto (Afghanistan) +default charset: UTF-8 + +OS Locale (lcid: 464, name: fil-PH): Filipino (Philippines) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 464, name: fil): Filipino (Philippines) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 465, name: dv-MV): Divehi (Maldives) - 0 +default locale: ID: dv_MV, Name: Divehi (Maldives) +display locale: ID: en_US, Name: English (United States) +format locale: ID: dv_MV, Name: Divehi (Maldives) +default charset: UTF-8 + +OS Locale (lcid: 468, name: ha-Latn-NG): Hausa (Latin) (Nigeria) - 1252 +default locale: ID: ha_NG, Name: Hausa (Nigeria) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ha_NG, Name: Hausa (Nigeria) +default charset: windows-1252 + +OS Locale (lcid: 468, name: ha-Latn): Hausa (Latin) (Nigeria) - 1252 +default locale: ID: ha_NG, Name: Hausa (Nigeria) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ha_NG, Name: Hausa (Nigeria) +default charset: windows-1252 + +OS Locale (lcid: 46a, name: yo-NG): Yoruba (Nigeria) - 1252 +default locale: ID: yo_NG, Name: Yoruba (Nigeria) +display locale: ID: en_US, Name: English (United States) +format locale: ID: yo_NG, Name: Yoruba (Nigeria) +default charset: windows-1252 + +OS Locale (lcid: 46b, name: quz): Quechua (Bolivia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 46b, name: quz-BO): Quechua (Bolivia) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 46c, name: nso): Sesotho sa Leboa (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 46c, name: nso-ZA): Sesotho sa Leboa (South Africa) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 46d, name: ba-RU): Bashkir (Russia) - 1251 +default locale: ID: ba_RU, Name: Bashkir (Russia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ba_RU, Name: Bashkir (Russia) +default charset: windows-1251 + +OS Locale (lcid: 46e, name: lb-LU): Luxembourgish (Luxembourg) - 1252 +default locale: ID: lb_LU, Name: Luxembourgish (Luxembourg) +display locale: ID: en_US, Name: English (United States) +format locale: ID: lb_LU, Name: Luxembourgish (Luxembourg) +default charset: windows-1252 + +OS Locale (lcid: 46f, name: kl-GL): Greenlandic (Greenland) - 1252 +default locale: ID: kl_GL, Name: Greenlandic (Greenland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: kl_GL, Name: Greenlandic (Greenland) +default charset: windows-1252 + +OS Locale (lcid: 470, name: ig-NG): Igbo (Nigeria) - 1252 +default locale: ID: ig_NG, Name: Igbo (Nigeria) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ig_NG, Name: Igbo (Nigeria) +default charset: windows-1252 + +OS Locale (lcid: 478, name: ii-CN): Yi (People's Republic of China) - 0 +default locale: ID: ii_CN, Name: Sichuan Yi (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ii_CN, Name: Sichuan Yi (China) +default charset: UTF-8 + +OS Locale (lcid: 47a, name: arn): Mapudungun (Chile) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 47a, name: arn-CL): Mapudungun (Chile) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 47c, name: moh): Mohawk (Canada) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 47c, name: moh-CA): Mohawk (Canada) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 47e, name: br-FR): Breton (France) - 1252 +default locale: ID: br_FR, Name: Breton (France) +display locale: ID: en_US, Name: English (United States) +format locale: ID: br_FR, Name: Breton (France) +default charset: windows-1252 + +OS Locale (lcid: 480, name: ug-CN): Uyghur (People's Republic of China) - 1256 +default locale: ID: ug_CN, Name: Uighur (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ug_CN, Name: Uighur (China) +default charset: windows-1256 + +OS Locale (lcid: 481, name: mi-NZ): Maori (New Zealand) - 0 +default locale: ID: mi_NZ, Name: Maori (New Zealand) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mi_NZ, Name: Maori (New Zealand) +default charset: UTF-8 + +OS Locale (lcid: 482, name: oc-FR): Occitan (France) - 1252 +default locale: ID: oc_FR, Name: Occitan (France) +display locale: ID: en_US, Name: English (United States) +format locale: ID: oc_FR, Name: Occitan (France) +default charset: windows-1252 + +OS Locale (lcid: 483, name: co-FR): Corsican (France) - 1252 +default locale: ID: co_FR, Name: Corsican (France) +display locale: ID: en_US, Name: English (United States) +format locale: ID: co_FR, Name: Corsican (France) +default charset: windows-1252 + +OS Locale (lcid: 484, name: gsw): Alsatian (France) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 484, name: gsw-FR): Alsatian (France) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 485, name: sah): Yakut (Russia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1251 + +OS Locale (lcid: 485, name: sah-RU): Yakut (Russia) - 1251 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1251 + +OS Locale (lcid: 486, name: qut): K'iche (Guatemala) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 486, name: qut-GT): K'iche (Guatemala) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 487, name: rw-RW): Kinyarwanda (Rwanda) - 1252 +default locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +display locale: ID: en_US, Name: English (United States) +format locale: ID: rw_RW, Name: Kinyarwanda (Rwanda) +default charset: windows-1252 + +OS Locale (lcid: 488, name: wo-SN): Wolof (Senegal) - 1252 +default locale: ID: wo_SN, Name: Wolof (Senegal) +display locale: ID: en_US, Name: English (United States) +format locale: ID: wo_SN, Name: Wolof (Senegal) +default charset: windows-1252 + +OS Locale (lcid: 48c, name: prs): Dari (Afghanistan) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1256 + +OS Locale (lcid: 48c, name: prs-AF): Dari (Afghanistan) - 1256 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1256 + +OS Locale (lcid: 491, name: gd-GB): Scottish Gaelic (United Kingdom) - 1252 +default locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +display locale: ID: en_US, Name: English (United States) +format locale: ID: gd_GB, Name: Scottish Gaelic (United Kingdom) +default charset: windows-1252 + +OS Locale (lcid: 801, name: ar-IQ): Arabic (Iraq) - 1256 +default locale: ID: ar_IQ, Name: Arabic (Iraq) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_IQ, Name: Arabic (Iraq) +default charset: windows-1256 + +OS Locale (lcid: 804, name: zh-Hans): Chinese (Simplified) (People's Republic of China) - 936 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale (lcid: 804, name: zh-CN): Chinese (Simplified) (People's Republic of China) - 936 +default locale: ID: zh_CN, Name: Chinese (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_CN, Name: Chinese (China) +default charset: GBK + +OS Locale (lcid: 807, name: de-CH): German (Switzerland) - 1252 +default locale: ID: de_CH, Name: German (Switzerland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_CH, Name: German (Switzerland) +default charset: windows-1252 + +OS Locale (lcid: 809, name: en-GB): English (United Kingdom) - 1252 +default locale: ID: en_GB, Name: English (United Kingdom) +display locale: ID: en_GB, Name: English (United Kingdom) +format locale: ID: en_GB, Name: English (United Kingdom) +default charset: windows-1252 + +OS Locale (lcid: 80a, name: es-MX): Spanish (Mexico) - 1252 +default locale: ID: es_MX, Name: Spanish (Mexico) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_MX, Name: Spanish (Mexico) +default charset: windows-1252 + +OS Locale (lcid: 80c, name: fr-BE): French (Belgium) - 1252 +default locale: ID: fr_BE, Name: French (Belgium) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_BE, Name: French (Belgium) +default charset: windows-1252 + +OS Locale (lcid: 810, name: it-CH): Italian (Switzerland) - 1252 +default locale: ID: it_CH, Name: Italian (Switzerland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: it_CH, Name: Italian (Switzerland) +default charset: windows-1252 + +OS Locale (lcid: 813, name: nl-BE): Dutch (Belgium) - 1252 +default locale: ID: nl_BE, Name: Dutch (Belgium) +display locale: ID: en_US, Name: English (United States) +format locale: ID: nl_BE, Name: Dutch (Belgium) +default charset: windows-1252 + +OS Locale (lcid: 814, name: nn-NO): Norwegian (Nynorsk) (Norway) - 1252 +default locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +display locale: ID: en_US, Name: English (United States) +format locale: ID: no_NO_NY, Name: Norwegian (Norway,Nynorsk) +default charset: windows-1252 + +OS Locale (lcid: 816, name: pt-PT): Portuguese (Portugal) - 1252 +default locale: ID: pt_PT, Name: Portuguese (Portugal) +display locale: ID: en_US, Name: English (United States) +format locale: ID: pt_PT, Name: Portuguese (Portugal) +default charset: windows-1252 + +OS Locale (lcid: 81a, name: sr-Latn-CS): Serbian (Latin) (Serbia and Montenegro (Former)) - 1250 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: windows-1250 + +OS Locale (lcid: 81d, name: sv-FI): Swedish (Finland) - 1252 +default locale: ID: sv_FI, Name: Swedish (Finland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sv_FI, Name: Swedish (Finland) +default charset: windows-1252 + +OS Locale (lcid: 82c, name: az-Cyrl-AZ): Azeri (Cyrillic) (Azerbaijan) - 1251 +default locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: windows-1251 + +OS Locale (lcid: 82c, name: az-Cyrl): Azeri (Cyrillic) (Azerbaijan) - 1251 +default locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: az_AZ, Name: Azerbaijani (Azerbaijan) +default charset: windows-1251 + +OS Locale (lcid: 82e, name: dsb): Lower Sorbian (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 82e, name: dsb-DE): Lower Sorbian (Germany) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 83b, name: se-SE): Sami (Northern) (Sweden) - 1252 +default locale: ID: se_SE, Name: Northern Sami (Sweden) +display locale: ID: en_US, Name: English (United States) +format locale: ID: se_SE, Name: Northern Sami (Sweden) +default charset: windows-1252 + +OS Locale (lcid: 83c, name: ga-IE): Irish (Ireland) - 1252 +default locale: ID: ga_IE, Name: Irish (Ireland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ga_IE, Name: Irish (Ireland) +default charset: windows-1252 + +OS Locale (lcid: 83e, name: ms-BN): Malay (Brunei Darussalam) - 1252 +default locale: ID: ms_BN, Name: Malay (Brunei) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ms_BN, Name: Malay (Brunei) +default charset: windows-1252 + +OS Locale (lcid: 843, name: uz-Cyrl-UZ): Uzbek (Cyrillic) (Uzbekistan) - 1251 +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: windows-1251 + +OS Locale (lcid: 843, name: uz-Cyrl): Uzbek (Cyrillic) (Uzbekistan) - 1251 +default locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: uz_UZ, Name: Uzbek (Uzbekistan) +default charset: windows-1251 + +OS Locale (lcid: 845, name: bn-BD): Bengali (Bangladesh) - 0 +default locale: ID: bn_BD, Name: Bengali (Bangladesh) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bn_BD, Name: Bengali (Bangladesh) +default charset: UTF-8 + +OS Locale (lcid: 850, name: mn-Mong-CN): Mongolian (Traditional Mongolian) (People's Republic of China) - 0 +default locale: ID: mn_CN, Name: Mongolian (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mn_CN, Name: Mongolian (China) +default charset: UTF-8 + +OS Locale (lcid: 850, name: mn-Mong): Mongolian (Traditional Mongolian) (People's Republic of China) - 0 +default locale: ID: mn_CN, Name: Mongolian (China) +display locale: ID: en_US, Name: English (United States) +format locale: ID: mn_CN, Name: Mongolian (China) +default charset: UTF-8 + +OS Locale (lcid: 85d, name: iu-Latn): Inuktitut (Latin) (Canada) - 1252 +default locale: ID: iu_CA, Name: Inuktitut (Canada) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iu_CA, Name: Inuktitut (Canada) +default charset: windows-1252 + +OS Locale (lcid: 85d, name: iu-Latn-CA): Inuktitut (Latin) (Canada) - 1252 +default locale: ID: iu_CA, Name: Inuktitut (Canada) +display locale: ID: en_US, Name: English (United States) +format locale: ID: iu_CA, Name: Inuktitut (Canada) +default charset: windows-1252 + +OS Locale (lcid: 85f, name: tzm): Tamazight (Latin) (Algeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 85f, name: tzm-Latn-DZ): Tamazight (Latin) (Algeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 85f, name: tzm-Latn): Tamazight (Latin) (Algeria) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 86b, name: quz-EC): Quechua (Ecuador) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: c01, name: ar-EG): Arabic (Egypt) - 1256 +default locale: ID: ar_EG, Name: Arabic (Egypt) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_EG, Name: Arabic (Egypt) +default charset: windows-1256 + +OS Locale (lcid: c04, name: zh-HK): Chinese (Traditional) (Hong Kong S.A.R.) - 950 +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-MS950-HKSCS + +OS Locale (lcid: c04, name: zh-Hant): Chinese (Traditional) (Hong Kong S.A.R.) - 950 +default locale: ID: zh_HK, Name: Chinese (Hong Kong) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_HK, Name: Chinese (Hong Kong) +default charset: x-windows-950 + +OS Locale (lcid: c07, name: de-AT): German (Austria) - 1252 +default locale: ID: de_AT, Name: German (Austria) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_AT, Name: German (Austria) +default charset: windows-1252 + +OS Locale (lcid: c09, name: en-AU): English (Australia) - 1252 +default locale: ID: en_AU, Name: English (Australia) +display locale: ID: en_AU, Name: English (Australia) +format locale: ID: en_AU, Name: English (Australia) +default charset: windows-1252 + +OS Locale (lcid: c0a, name: es-ES): Spanish (Spain) - 1252 +default locale: ID: es_ES, Name: Spanish (Spain) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_ES, Name: Spanish (Spain) +default charset: windows-1252 + +OS Locale (lcid: c0c, name: fr-CA): French (Canada) - 1252 +default locale: ID: fr_CA, Name: French (Canada) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_CA, Name: French (Canada) +default charset: windows-1252 + +OS Locale (lcid: c1a, name: sr-Cyrl-CS): Serbian (Cyrillic) (Serbia and Montenegro (Former)) - 1251 +default locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_CS, Name: Serbian (Serbia and Montenegro) +default charset: windows-1251 + +OS Locale (lcid: c3b, name: se-FI): Sami (Northern) (Finland) - 1252 +default locale: ID: se_FI, Name: Northern Sami (Finland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: se_FI, Name: Northern Sami (Finland) +default charset: windows-1252 + +OS Locale (lcid: c6b, name: quz-PE): Quechua (Peru) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1001, name: ar-LY): Arabic (Libya) - 1256 +default locale: ID: ar_LY, Name: Arabic (Libya) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_LY, Name: Arabic (Libya) +default charset: windows-1256 + +OS Locale (lcid: 1004, name: zh-SG): Chinese (Simplified) (Singapore) - 936 +default locale: ID: zh_SG, Name: Chinese (Singapore) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_SG, Name: Chinese (Singapore) +default charset: GBK + +OS Locale (lcid: 1007, name: de-LU): German (Luxembourg) - 1252 +default locale: ID: de_LU, Name: German (Luxembourg) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_LU, Name: German (Luxembourg) +default charset: windows-1252 + +OS Locale (lcid: 1009, name: en-CA): English (Canada) - 1252 +default locale: ID: en_CA, Name: English (Canada) +display locale: ID: en_CA, Name: English (Canada) +format locale: ID: en_CA, Name: English (Canada) +default charset: windows-1252 + +OS Locale (lcid: 100a, name: es-GT): Spanish (Guatemala) - 1252 +default locale: ID: es_GT, Name: Spanish (Guatemala) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_GT, Name: Spanish (Guatemala) +default charset: windows-1252 + +OS Locale (lcid: 100c, name: fr-CH): French (Switzerland) - 1252 +default locale: ID: fr_CH, Name: French (Switzerland) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_CH, Name: French (Switzerland) +default charset: windows-1252 + +OS Locale (lcid: 101a, name: hr-BA): Croatian (Latin) (Bosnia and Herzegovina) - 1250 +default locale: ID: hr_BA, Name: Croatian (Bosnia and Herzegovina) +display locale: ID: en_US, Name: English (United States) +format locale: ID: hr_BA, Name: Croatian (Bosnia and Herzegovina) +default charset: windows-1250 + +OS Locale (lcid: 103b, name: smj-NO): Sami (Lule) (Norway) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1401, name: ar-DZ): Arabic (Algeria) - 1256 +default locale: ID: ar_DZ, Name: Arabic (Algeria) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_DZ, Name: Arabic (Algeria) +default charset: windows-1256 + +OS Locale (lcid: 1404, name: zh-MO): Chinese (Traditional) (Macao S.A.R.) - 950 +default locale: ID: zh_MO, Name: Chinese (Macao) +display locale: ID: en_US, Name: English (United States) +format locale: ID: zh_MO, Name: Chinese (Macao) +default charset: x-windows-950 + +OS Locale (lcid: 1407, name: de-LI): German (Liechtenstein) - 1252 +default locale: ID: de_LI, Name: German (Liechtenstein) +display locale: ID: en_US, Name: English (United States) +format locale: ID: de_LI, Name: German (Liechtenstein) +default charset: windows-1252 + +OS Locale (lcid: 1409, name: en-NZ): English (New Zealand) - 1252 +default locale: ID: en_NZ, Name: English (New Zealand) +display locale: ID: en_NZ, Name: English (New Zealand) +format locale: ID: en_NZ, Name: English (New Zealand) +default charset: windows-1252 + +OS Locale (lcid: 140a, name: es-CR): Spanish (Costa Rica) - 1252 +default locale: ID: es_CR, Name: Spanish (Costa Rica) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_CR, Name: Spanish (Costa Rica) +default charset: windows-1252 + +OS Locale (lcid: 140c, name: fr-LU): French (Luxembourg) - 1252 +default locale: ID: fr_LU, Name: French (Luxembourg) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_LU, Name: French (Luxembourg) +default charset: windows-1252 + +OS Locale (lcid: 141a, name: bs-Latn): Bosnian (Latin) (Bosnia and Herzegovina) - 1250 +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: windows-1250 + +OS Locale (lcid: 141a, name: bs-Latn-BA): Bosnian (Latin) (Bosnia and Herzegovina) - 1250 +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: windows-1250 + +OS Locale (lcid: 143b, name: smj-SE): Sami (Lule) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 143b, name: smj): Sami (Lule) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1801, name: ar-MA): Arabic (Morocco) - 1256 +default locale: ID: ar_MA, Name: Arabic (Morocco) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_MA, Name: Arabic (Morocco) +default charset: windows-1256 + +OS Locale (lcid: 1809, name: en-IE): English (Ireland) - 1252 +default locale: ID: en_IE, Name: English (Ireland) +display locale: ID: en_IE, Name: English (Ireland) +format locale: ID: en_IE, Name: English (Ireland) +default charset: windows-1252 + +OS Locale (lcid: 180a, name: es-PA): Spanish (Panama) - 1252 +default locale: ID: es_PA, Name: Spanish (Panama) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_PA, Name: Spanish (Panama) +default charset: windows-1252 + +OS Locale (lcid: 180c, name: fr-MC): French (Principality of Monaco) - 1252 +default locale: ID: fr_MC, Name: French (Monaco) +display locale: ID: en_US, Name: English (United States) +format locale: ID: fr_MC, Name: French (Monaco) +default charset: windows-1252 + +OS Locale (lcid: 181a, name: sr-Latn-BA): Serbian (Latin) (Bosnia and Herzegovina) - 1250 +default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +default charset: windows-1250 + +OS Locale (lcid: 183b, name: sma-NO): Sami (Southern) (Norway) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1c01, name: ar-TN): Arabic (Tunisia) - 1256 +default locale: ID: ar_TN, Name: Arabic (Tunisia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_TN, Name: Arabic (Tunisia) +default charset: windows-1256 + +OS Locale (lcid: 1c09, name: en-ZA): English (South Africa) - 1252 +default locale: ID: en_ZA, Name: English (South Africa) +display locale: ID: en_ZA, Name: English (South Africa) +format locale: ID: en_ZA, Name: English (South Africa) +default charset: windows-1252 + +OS Locale (lcid: 1c0a, name: es-DO): Spanish (Dominican Republic) - 1252 +default locale: ID: es_DO, Name: Spanish (Dominican Republic) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_DO, Name: Spanish (Dominican Republic) +default charset: windows-1252 + +OS Locale (lcid: 1c1a, name: sr-Cyrl-BA): Serbian (Cyrillic) (Bosnia and Herzegovina) - 1251 +default locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_BA, Name: Serbian (Bosnia and Herzegovina) +default charset: windows-1251 + +OS Locale (lcid: 1c3b, name: sma): Sami (Southern) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 1c3b, name: sma-SE): Sami (Southern) (Sweden) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 2001, name: ar-OM): Arabic (Oman) - 1256 +default locale: ID: ar_OM, Name: Arabic (Oman) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_OM, Name: Arabic (Oman) +default charset: windows-1256 + +OS Locale (lcid: 2009, name: en-JM): English (Jamaica) - 1252 +default locale: ID: en_JM, Name: English (Jamaica) +display locale: ID: en_JM, Name: English (Jamaica) +format locale: ID: en_JM, Name: English (Jamaica) +default charset: windows-1252 + +OS Locale (lcid: 200a, name: es-VE): Spanish (Bolivarian Republic of Venezuela) - 1252 +default locale: ID: es_VE, Name: Spanish (Venezuela) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_VE, Name: Spanish (Venezuela) +default charset: windows-1252 + +OS Locale (lcid: 201a, name: bs-Cyrl-BA): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251 +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: windows-1251 + +OS Locale (lcid: 201a, name: bs-Cyrl): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251 +default locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +display locale: ID: en_US, Name: English (United States) +format locale: ID: bs_BA, Name: Bosnian (Bosnia and Herzegovina) +default charset: windows-1251 + +OS Locale (lcid: 203b, name: sms-FI): Sami (Skolt) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 203b, name: sms): Sami (Skolt) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 2401, name: ar-YE): Arabic (Yemen) - 1256 +default locale: ID: ar_YE, Name: Arabic (Yemen) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_YE, Name: Arabic (Yemen) +default charset: windows-1256 + +OS Locale (lcid: 2409, name: en-029): English (Caribbean) - 1252 +default locale: ID: en, Name: English +display locale: ID: en, Name: English +format locale: ID: en, Name: English +default charset: windows-1252 + +OS Locale (lcid: 240a, name: es-CO): Spanish (Colombia) - 1252 +default locale: ID: es_CO, Name: Spanish (Colombia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_CO, Name: Spanish (Colombia) +default charset: windows-1252 + +OS Locale (lcid: 241a, name: sr-Latn-RS): Serbian (Latin) (Serbia) - 1250 +default locale: ID: sr_RS, Name: Serbian (Serbia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_RS, Name: Serbian (Serbia) +default charset: windows-1250 + +OS Locale (lcid: 241a, name: sr-Latn): Serbian (Latin) (Serbia) - 1250 +default locale: ID: sr_RS, Name: Serbian (Serbia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_RS, Name: Serbian (Serbia) +default charset: windows-1250 + +OS Locale (lcid: 243b, name: smn): Sami (Inari) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 243b, name: smn-FI): Sami (Inari) (Finland) - 1252 +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS Locale (lcid: 2801, name: ar-SY): Arabic (Syria) - 1256 +default locale: ID: ar_SY, Name: Arabic (Syria) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_SY, Name: Arabic (Syria) +default charset: windows-1256 + +OS Locale (lcid: 2809, name: en-BZ): English (Belize) - 1252 +default locale: ID: en_BZ, Name: English (Belize) +display locale: ID: en_BZ, Name: English (Belize) +format locale: ID: en_BZ, Name: English (Belize) +default charset: windows-1252 + +OS Locale (lcid: 280a, name: es-PE): Spanish (Peru) - 1252 +default locale: ID: es_PE, Name: Spanish (Peru) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_PE, Name: Spanish (Peru) +default charset: windows-1252 + +OS Locale (lcid: 281a, name: sr-Cyrl-RS): Serbian (Cyrillic) (Serbia) - 1251 +default locale: ID: sr_RS, Name: Serbian (Serbia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_RS, Name: Serbian (Serbia) +default charset: windows-1251 + +OS Locale (lcid: 281a, name: sr-Cyrl): Serbian (Cyrillic) (Serbia) - 1251 +default locale: ID: sr_RS, Name: Serbian (Serbia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_RS, Name: Serbian (Serbia) +default charset: windows-1251 + +OS Locale (lcid: 2c01, name: ar-JO): Arabic (Jordan) - 1256 +default locale: ID: ar_JO, Name: Arabic (Jordan) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_JO, Name: Arabic (Jordan) +default charset: windows-1256 + +OS Locale (lcid: 2c09, name: en-TT): English (Trinidad and Tobago) - 1252 +default locale: ID: en_TT, Name: English (Trinidad and Tobago) +display locale: ID: en_TT, Name: English (Trinidad and Tobago) +format locale: ID: en_TT, Name: English (Trinidad and Tobago) +default charset: windows-1252 + +OS Locale (lcid: 2c0a, name: es-AR): Spanish (Argentina) - 1252 +default locale: ID: es_AR, Name: Spanish (Argentina) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_AR, Name: Spanish (Argentina) +default charset: windows-1252 + +OS Locale (lcid: 2c1a, name: sr-Latn-ME): Serbian (Latin) (Montenegro) - 1250 +default locale: ID: sr_ME, Name: Serbian (Montenegro) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_ME, Name: Serbian (Montenegro) +default charset: windows-1250 + +OS Locale (lcid: 3001, name: ar-LB): Arabic (Lebanon) - 1256 +default locale: ID: ar_LB, Name: Arabic (Lebanon) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_LB, Name: Arabic (Lebanon) +default charset: windows-1256 + +OS Locale (lcid: 3009, name: en-ZW): English (Zimbabwe) - 1252 +default locale: ID: en_ZW, Name: English (Zimbabwe) +display locale: ID: en_ZW, Name: English (Zimbabwe) +format locale: ID: en_ZW, Name: English (Zimbabwe) +default charset: windows-1252 + +OS Locale (lcid: 300a, name: es-EC): Spanish (Ecuador) - 1252 +default locale: ID: es_EC, Name: Spanish (Ecuador) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_EC, Name: Spanish (Ecuador) +default charset: windows-1252 + +OS Locale (lcid: 301a, name: sr-Cyrl-ME): Serbian (Cyrillic) (Montenegro) - 1251 +default locale: ID: sr_ME, Name: Serbian (Montenegro) +display locale: ID: en_US, Name: English (United States) +format locale: ID: sr_ME, Name: Serbian (Montenegro) +default charset: windows-1251 + +OS Locale (lcid: 3401, name: ar-KW): Arabic (Kuwait) - 1256 +default locale: ID: ar_KW, Name: Arabic (Kuwait) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_KW, Name: Arabic (Kuwait) +default charset: windows-1256 + +OS Locale (lcid: 3409, name: en-PH): English (Republic of the Philippines) - 1252 +default locale: ID: en_PH, Name: English (Philippines) +display locale: ID: en_PH, Name: English (Philippines) +format locale: ID: en_PH, Name: English (Philippines) +default charset: windows-1252 + +OS Locale (lcid: 340a, name: es-CL): Spanish (Chile) - 1252 +default locale: ID: es_CL, Name: Spanish (Chile) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_CL, Name: Spanish (Chile) +default charset: windows-1252 + +OS Locale (lcid: 3801, name: ar-AE): Arabic (U.A.E.) - 1256 +default locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_AE, Name: Arabic (United Arab Emirates) +default charset: windows-1256 + +OS Locale (lcid: 380a, name: es-UY): Spanish (Uruguay) - 1252 +default locale: ID: es_UY, Name: Spanish (Uruguay) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_UY, Name: Spanish (Uruguay) +default charset: windows-1252 + +OS Locale (lcid: 3c01, name: ar-BH): Arabic (Bahrain) - 1256 +default locale: ID: ar_BH, Name: Arabic (Bahrain) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_BH, Name: Arabic (Bahrain) +default charset: windows-1256 + +OS Locale (lcid: 3c0a, name: es-PY): Spanish (Paraguay) - 1252 +default locale: ID: es_PY, Name: Spanish (Paraguay) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_PY, Name: Spanish (Paraguay) +default charset: windows-1252 + +OS Locale (lcid: 4001, name: ar-QA): Arabic (Qatar) - 1256 +default locale: ID: ar_QA, Name: Arabic (Qatar) +display locale: ID: en_US, Name: English (United States) +format locale: ID: ar_QA, Name: Arabic (Qatar) +default charset: windows-1256 + +OS Locale (lcid: 4009, name: en-IN): English (India) - 1252 +default locale: ID: en_IN, Name: English (India) +display locale: ID: en_IN, Name: English (India) +format locale: ID: en_IN, Name: English (India) +default charset: windows-1252 + +OS Locale (lcid: 400a, name: es-BO): Spanish (Bolivia) - 1252 +default locale: ID: es_BO, Name: Spanish (Bolivia) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_BO, Name: Spanish (Bolivia) +default charset: windows-1252 + +OS Locale (lcid: 4409, name: en-MY): English (Malaysia) - 1252 +default locale: ID: en_MY, Name: English (Malaysia) +display locale: ID: en_MY, Name: English (Malaysia) +format locale: ID: en_MY, Name: English (Malaysia) +default charset: windows-1252 + +OS Locale (lcid: 440a, name: es-SV): Spanish (El Salvador) - 1252 +default locale: ID: es_SV, Name: Spanish (El Salvador) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_SV, Name: Spanish (El Salvador) +default charset: windows-1252 + +OS Locale (lcid: 4809, name: en-SG): English (Singapore) - 1252 +default locale: ID: en_SG, Name: English (Singapore) +display locale: ID: en_SG, Name: English (Singapore) +format locale: ID: en_SG, Name: English (Singapore) +default charset: windows-1252 + +OS Locale (lcid: 480a, name: es-HN): Spanish (Honduras) - 1252 +default locale: ID: es_HN, Name: Spanish (Honduras) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_HN, Name: Spanish (Honduras) +default charset: windows-1252 + +OS Locale (lcid: 4c0a, name: es-NI): Spanish (Nicaragua) - 1252 +default locale: ID: es_NI, Name: Spanish (Nicaragua) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_NI, Name: Spanish (Nicaragua) +default charset: windows-1252 + +OS Locale (lcid: 500a, name: es-PR): Spanish (Puerto Rico) - 1252 +default locale: ID: es_PR, Name: Spanish (Puerto Rico) +display locale: ID: en_US, Name: English (United States) +format locale: ID: es_PR, Name: Spanish (Puerto Rico) +default charset: windows-1252 + +OS Locale (lcid: 540a, name: es-US): Spanish (United States) - 1252 +default locale: ID: es_US, Name: Spanish (United States) +display locale: ID: en, Name: English +format locale: ID: es_US, Name: Spanish (United States) +default charset: windows-1252 + +OS UI Language (name: en-US) +default locale: ID: en_US, Name: English (United States) +display locale: ID: en_US, Name: English (United States) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 + +OS UI Language (name: ja-JP) +default locale: ID: en_US, Name: English (United States) +display locale: ID: ja_JP, Name: Japanese (Japan) +format locale: ID: en_US, Name: English (United States) +default charset: windows-1252 diff --git a/jdk/test/java/util/Locale/data/deflocale.winvista b/jdk/test/java/util/Locale/data/deflocale.winvista deleted file mode 100644 index fe17802fe4a..00000000000 --- a/jdk/test/java/util/Locale/data/deflocale.winvista +++ /dev/null @@ -1,1031 +0,0 @@ -# OSVersionInfo -# MajorVersion: 6 -# MinorVersion: 0 -# BuildNumber: 5456 -# CSDVersion: Service Pack 0 v. - - -OS Locale (lcid: 401): Arabic (Saudi Arabia) - 1256 -ar_SA -Arabic (Saudi Arabia) -windows-1256 - -OS Locale (lcid: 402): Bulgarian (Bulgaria) - 1251 -bg_BG -Bulgarian (Bulgaria) -windows-1251 - -OS Locale (lcid: 403): Catalan (Spain) - 1252 -ca_ES -Catalan (Spain) -windows-1252 - -OS Locale (lcid: 404): Chinese (Taiwan) - 950 -zh_TW -Chinese (Taiwan) -x-windows-950 - -OS Locale (lcid: 405): Czech (Czech Republic) - 1250 -cs_CZ -Czech (Czech Republic) -windows-1250 - -OS Locale (lcid: 406): Danish (Denmark) - 1252 -da_DK -Danish (Denmark) -windows-1252 - -OS Locale (lcid: 407): German (Germany) - 1252 -de_DE -German (Germany) -windows-1252 - -OS Locale (lcid: 408): Greek (Greece) - 1253 -el_GR -Greek (Greece) -windows-1253 - -OS Locale (lcid: 409): English (United States) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 40b): Finnish (Finland) - 1252 -fi_FI -Finnish (Finland) -windows-1252 - -OS Locale (lcid: 40c): French (France) - 1252 -fr_FR -French (France) -windows-1252 - -OS Locale (lcid: 40d): Hebrew (Israel) - 1255 -iw_IL -Hebrew (Israel) -windows-1255 - -OS Locale (lcid: 40e): Hungarian (Hungary) - 1250 -hu_HU -Hungarian (Hungary) -windows-1250 - -OS Locale (lcid: 40f): Icelandic (Iceland) - 1252 -is_IS -Icelandic (Iceland) -windows-1252 - -OS Locale (lcid: 410): Italian (Italy) - 1252 -it_IT -Italian (Italy) -windows-1252 - -OS Locale (lcid: 411): Japanese (Japan) - 932 -ja_JP -Japanese (Japan) -windows-31j - -OS Locale (lcid: 412): Korean (Korea) - 949 -ko_KR -Korean (South Korea) -x-windows-949 - -OS Locale (lcid: 413): Dutch (Netherlands) - 1252 -nl_NL -Dutch (Netherlands) -windows-1252 - -OS Locale (lcid: 414): Norwegian (Bokmål) (Norway) - 1252 -no_NO -Norwegian (Norway) -windows-1252 - -OS Locale (lcid: 415): Polish (Poland) - 1250 -pl_PL -Polish (Poland) -windows-1250 - -OS Locale (lcid: 416): Portuguese (Brazil) - 1252 -pt_BR -Portuguese (Brazil) -windows-1252 - -OS Locale (lcid: 417): Romansh (Switzerland) - 1252 -rm_CH -Raeto-Romance (Switzerland) -windows-1252 - -OS Locale (lcid: 418): Romanian (Romania) - 1250 -ro_RO -Romanian (Romania) -windows-1250 - -OS Locale (lcid: 419): Russian (Russia) - 1251 -ru_RU -Russian (Russia) -windows-1251 - -OS Locale (lcid: 41a): Croatian (Croatia) - 1250 -hr_HR -Croatian (Croatia) -windows-1250 - -OS Locale (lcid: 41b): Slovak (Slovakia) - 1250 -sk_SK -Slovak (Slovakia) -windows-1250 - -OS Locale (lcid: 41c): Albanian (Albania) - 1250 -sq_AL -Albanian (Albania) -windows-1250 - -OS Locale (lcid: 41d): Swedish (Sweden) - 1252 -sv_SE -Swedish (Sweden) -windows-1252 - -OS Locale (lcid: 41e): Thai (Thailand) - 874 -th_TH -Thai (Thailand) -x-windows-874 - -OS Locale (lcid: 41f): Turkish (Turkey) - 1254 -tr_TR -Turkish (Turkey) -windows-1254 - -OS Locale (lcid: 420): Urdu (Islamic Republic of Pakistan) - 0 -ur_PK -Urdu (Pakistan) -windows-1256 - -OS Locale (lcid: 421): Indonesian (Indonesia) - 1252 -in_ID -Indonesian (Indonesia) -windows-1252 - -OS Locale (lcid: 422): Ukrainian (Ukraine) - 1251 -uk_UA -Ukrainian (Ukraine) -windows-1251 - -OS Locale (lcid: 423): Belarusian (Belarus) - 1251 -be_BY -Belarusian (Belarus) -windows-1251 - -OS Locale (lcid: 424): Slovenian (Slovenia) - 1250 -sl_SI -Slovenian (Slovenia) -windows-1250 - -OS Locale (lcid: 425): Estonian (Estonia) - 1257 -et_EE -Estonian (Estonia) -windows-1257 - -OS Locale (lcid: 426): Latvian (Latvia) - 1257 -lv_LV -Latvian (Latvia) -windows-1257 - -OS Locale (lcid: 427): Lithuanian (Lithuania) - 1257 -lt_LT -Lithuanian (Lithuania) -windows-1257 - -OS Locale (lcid: 428): Tajik (Cyrillic) (Tajikistan) - 1251 -tg_TJ -Tajik (Tajikistan) -windows-1251 - -OS Locale (lcid: 429): Persian (Iran) - 1256 -fa_IR -Persian (Iran) -windows-1256 - -OS Locale (lcid: 42a): Vietnamese (Vietnam) - 1258 -vi_VN -Vietnamese (Vietnam) -windows-1258 - -OS Locale (lcid: 42b): Armenian (Armenia) - 0 -hy_AM -Armenian (Armenia) -UTF-8 - -OS Locale (lcid: 42c): Azeri (Latin) (Azerbaijan) - 1254 -az_AZ -Azerbaijani (Azerbaijan) -windows-1254 - -OS Locale (lcid: 42d): Basque (Spain) - 1252 -eu_ES -Basque (Spain) -windows-1252 - -OS Locale (lcid: 42e): Upper Sorbian (Germany) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 42f): Macedonian (FYROM) (Macedonia (FYROM)) - 1251 -mk_MK -Macedonian (Macedonia) -windows-1251 - -OS Locale (lcid: 432): Setswana (South Africa) - 1252 -tn_ZA -Tswana (South Africa) -windows-1252 - -OS Locale (lcid: 434): isiXhosa (South Africa) - 1252 -xh_ZA -Xhosa (South Africa) -windows-1252 - -OS Locale (lcid: 435): isiZulu (South Africa) - 1252 -zu_ZA -Zulu (South Africa) -windows-1252 - -OS Locale (lcid: 436): Afrikaans (South Africa) - 1252 -af_ZA -Afrikaans (South Africa) -windows-1252 - -OS Locale (lcid: 437): Georgian (Georgia) - 0 -ka_GE -Georgian (Georgia) -UTF-8 - -OS Locale (lcid: 438): Faroese (Faroe Islands) - 1252 -fo_FO -Faroese (Faroe Islands) -windows-1252 - -OS Locale (lcid: 439): Hindi (India) - 0 -hi_IN -Hindi (India) -UTF-8 - -OS Locale (lcid: 43a): Maltese (Malta) - 0 -mt_MT -Maltese (Malta) -UTF-8 - -OS Locale (lcid: 43b): Sami (Northern) (Norway) - 1252 -se_NO -Northern Sami (Norway) -windows-1252 - -OS Locale (lcid: 43e): Malay (Malaysia) - 1252 -ms_MY -Malay (Malaysia) -windows-1252 - -OS Locale (lcid: 43f): Kazakh (Kazakhstan) - 0 -kk_KZ -Kazakh (Kazakhstan) -windows-1251 - -OS Locale (lcid: 440): Kyrgyz (Kyrgyzstan) - 1251 -ky_KG -Kirghiz (Kyrgyzstan) -windows-1251 - -OS Locale (lcid: 441): Kiswahili (Kenya) - 1252 -sw_KE -Swahili (Kenya) -windows-1252 - -OS Locale (lcid: 442): Turkmen (Turkmenistan) - 1250 -tk_TM -Turkmen (Turkmenistan) -windows-1250 - -OS Locale (lcid: 443): Uzbek (Latin) (Uzbekistan) - 1254 -uz_UZ -Uzbek (Uzbekistan) -windows-1254 - -OS Locale (lcid: 444): Tatar (Russia) - 1251 -tt_RU -Tatar (Russia) -windows-1251 - -OS Locale (lcid: 445): Bengali (India) - 0 -bn_IN -Bengali (India) -UTF-8 - -OS Locale (lcid: 446): Punjabi (India) - 0 -pa_IN -Panjabi (India) -UTF-8 - -OS Locale (lcid: 447): Gujarati (India) - 0 -gu_IN -Gujarati (India) -UTF-8 - -OS Locale (lcid: 448): Oriya (India) - 0 -or_IN -Oriya (India) -UTF-8 - -OS Locale (lcid: 449): Tamil (India) - 0 -ta_IN -Tamil (India) -UTF-8 - -OS Locale (lcid: 44a): Telugu (India) - 0 -te_IN -Telugu (India) -UTF-8 - -OS Locale (lcid: 44b): Kannada (India) - 0 -kn_IN -Kannada (India) -UTF-8 - -OS Locale (lcid: 44c): Malayalam (India) - 0 -ml_IN -Malayalam (India) -UTF-8 - -OS Locale (lcid: 44d): Assamese (India) - 0 -as_IN -Assamese (India) -UTF-8 - -OS Locale (lcid: 44e): Marathi (India) - 0 -mr_IN -Marathi (India) -UTF-8 - -OS Locale (lcid: 44f): Sanskrit (India) - 0 -sa_IN -Sanskrit (India) -UTF-8 - -OS Locale (lcid: 450): Mongolian (Cyrillic) (Mongolia) - 1251 -mn_MN -Mongolian (Mongolia) -windows-1251 - -OS Locale (lcid: 451): Tibetan (People's Republic of China) - 0 -bo_CN -Tibetan (China) -UTF-8 - -OS Locale (lcid: 452): Welsh (United Kingdom) - 1252 -cy_GB -Welsh (United Kingdom) -windows-1252 - -OS Locale (lcid: 453): Khmer (Cambodia) - 0 -km_KH -Khmer (Cambodia) -UTF-8 - -OS Locale (lcid: 454): Lao (Lao P.D.R.) - 0 -lo_LA -Lao (Laos) -UTF-8 - -OS Locale (lcid: 456): Galician (Spain) - 1252 -gl_ES -Gallegan (Spain) -windows-1252 - -OS Locale (lcid: 457): Konkani (India) - 0 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 45a): Syriac (Syria) - 0 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 45b): Sinhala (Sri Lanka) - 0 -si_LK -Sinhalese (Sri Lanka) -UTF-8 - -OS Locale (lcid: 45d): Inuktitut (Canada) - 0 -iu_CA -Inuktitut (Canada) -UTF-8 - -OS Locale (lcid: 45e): Amharic (Ethiopia) - 0 -am_ET -Amharic (Ethiopia) -UTF-8 - -OS Locale (lcid: 461): Nepali (Nepal) - 0 -ne_NP -Nepali (Nepal) -UTF-8 - -OS Locale (lcid: 462): Frisian (Netherlands) - 1252 -fy_NL -Frisian (Netherlands) -windows-1252 - -OS Locale (lcid: 463): Pashto (Afghanistan) - 0 -ps_AF -Pushto (Afghanistan) -windows-1256 - -OS Locale (lcid: 464): Filipino (Philippines) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 465): Divehi (Maldives) - 0 -dv_MV -Divehi (Maldives) -UTF-8 - -OS Locale (lcid: 468): Hausa (Latin) (Nigeria) - 1252 -ha_NG -Hausa (Nigeria) -windows-1252 - -OS Locale (lcid: 46a): Yoruba (Nigeria) - 1252 -yo_NG -Yoruba (Nigeria) -windows-1252 - -OS Locale (lcid: 46b): Quechua (Bolivia) - 1252 -qu_BO -Quechua (Bolivia) -windows-1252 - -OS Locale (lcid: 46c): Sesotho sa Leboa (South Africa) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 46d): Bashkir (Russia) - 1251 -ba_RU -Bashkir (Russia) -windows-1251 - -OS Locale (lcid: 46e): Luxembourgish (Luxembourg) - 1252 -lb_LU -Luxembourgish (Luxembourg) -windows-1252 - -OS Locale (lcid: 46f): Greenlandic (Greenland) - 1252 -kl_GL -Greenlandic (Greenland) -windows-1252 - -OS Locale (lcid: 470): Igbo (Nigeria) - 1252 -ig_NG -Igbo (Nigeria) -windows-1252 - -OS Locale (lcid: 478): Yi (People's Republic of China) - 0 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 47a): Mapudungun (Chile) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 47c): Mohawk (Canada) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 47e): Breton (France) - 1252 -br_FR -Breton (France) -windows-1252 - -OS Locale (lcid: 480): Uighur (People's Republic of China) - 1256 -ug_CN -Uighur (China) -windows-1256 - -OS Locale (lcid: 481): Maori (New Zealand) - 0 -mi_NZ -Maori (New Zealand) -UTF-8 - -OS Locale (lcid: 482): Occitan (France) - 1252 -oc_FR -Occitan (France) -windows-1252 - -OS Locale (lcid: 483): Corsican (France) - 1252 -co_FR -Corsican (France) -windows-1252 - -OS Locale (lcid: 484): Alsatian (France) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 485): Yakut (Russia) - 1251 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 486): K'iche (Guatemala) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 487): Kinyarwanda (Rwanda) - 1252 -rw_RW -Kinyarwanda (Rwanda) -windows-1252 - -OS Locale (lcid: 488): Wolof (Senegal) - 1252 -wo_SN -Wolof (Senegal) -windows-1252 - -OS Locale (lcid: 48c): Dari (Afghanistan) - 1256 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 801): Arabic (Iraq) - 1256 -ar_IQ -Arabic (Iraq) -windows-1256 - -OS Locale (lcid: 804): Chinese (People's Republic of China) - 936 -zh_CN -Chinese (China) -GBK - -OS Locale (lcid: 807): German (Switzerland) - 1252 -de_CH -German (Switzerland) -windows-1252 - -OS Locale (lcid: 809): English (United Kingdom) - 1252 -en_GB -English (United Kingdom) -windows-1252 - -OS Locale (lcid: 80a): Spanish (Mexico) - 1252 -es_MX -Spanish (Mexico) -windows-1252 - -OS Locale (lcid: 80c): French (Belgium) - 1252 -fr_BE -French (Belgium) -windows-1252 - -OS Locale (lcid: 810): Italian (Switzerland) - 1252 -it_CH -Italian (Switzerland) -windows-1252 - -OS Locale (lcid: 813): Dutch (Belgium) - 1252 -nl_BE -Dutch (Belgium) -windows-1252 - -OS Locale (lcid: 814): Norwegian (Nynorsk) (Norway) - 1252 -no_NO_NY -Norwegian (Norway,Nynorsk) -windows-1252 - -OS Locale (lcid: 816): Portuguese (Portugal) - 1252 -pt_PT -Portuguese (Portugal) -windows-1252 - -OS Locale (lcid: 81a): Serbian (Latin) (Serbia and Montenegro) - 1250 -sr_CS -Serbian (Serbia and Montenegro) -windows-1250 - -OS Locale (lcid: 81d): Swedish (Finland) - 1252 -sv_FI -Swedish (Finland) -windows-1252 - -OS Locale (lcid: 82c): Azeri (Cyrillic) (Azerbaijan) - 1251 -az_AZ -Azerbaijani (Azerbaijan) -windows-1251 - -OS Locale (lcid: 82e): Lower Sorbian (Germany) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 83b): Sami (Northern) (Sweden) - 1252 -se_SE -Northern Sami (Sweden) -windows-1252 - -OS Locale (lcid: 83c): Irish (Ireland) - 1252 -ga_IE -Irish (Ireland) -windows-1252 - -OS Locale (lcid: 83e): Malay (Brunei Darussalam) - 1252 -ms_BN -Malay (Brunei) -windows-1252 - -OS Locale (lcid: 843): Uzbek (Cyrillic) (Uzbekistan) - 1251 -uz_UZ -Uzbek (Uzbekistan) -windows-1251 - -OS Locale (lcid: 845): Bengali (Bangladesh) - 0 -bn_BD -Bengali (Bangladesh) -UTF-8 - -OS Locale (lcid: 850): Mongolian (Traditional Mongolian) (People's Republic of China) - 0 -mn_CN -Mongolian (China) -UTF-8 - -OS Locale (lcid: 85d): Inuktitut (Latin) (Canada) - 1252 -iu_CA -Inuktitut (Canada) -windows-1252 - -OS Locale (lcid: 85f): Tamazight (Latin) (Algeria) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 86b): Quechua (Ecuador) - 1252 -qu_EC -Quechua (Ecuador) -windows-1252 - -OS Locale (lcid: c01): Arabic (Egypt) - 1256 -ar_EG -Arabic (Egypt) -windows-1256 - -OS Locale (lcid: c04): Chinese (Hong Kong S.A.R.) - 950 -zh_HK -Chinese (Hong Kong) -x-windows-950 - -OS Locale (lcid: c07): German (Austria) - 1252 -de_AT -German (Austria) -windows-1252 - -OS Locale (lcid: c09): English (Australia) - 1252 -en_AU -English (Australia) -windows-1252 - -OS Locale (lcid: c0a): Spanish (Spain) - 1252 -es_ES -Spanish (Spain) -windows-1252 - -OS Locale (lcid: c0c): French (Canada) - 1252 -fr_CA -French (Canada) -windows-1252 - -OS Locale (lcid: c1a): Serbian (Cyrillic) (Serbia and Montenegro) - 1251 -sr_CS -Serbian (Serbia and Montenegro) -windows-1251 - -OS Locale (lcid: c3b): Sami (Northern) (Finland) - 1252 -se_FI -Northern Sami (Finland) -windows-1252 - -OS Locale (lcid: c6b): Quechua (Peru) - 1252 -qu_PE -Quechua (Peru) -windows-1252 - -OS Locale (lcid: 1001): Arabic (Libya) - 1256 -ar_LY -Arabic (Libya) -windows-1256 - -OS Locale (lcid: 1004): Chinese (Singapore) - 936 -zh_SG -Chinese (Singapore) -GBK - -OS Locale (lcid: 1007): German (Luxembourg) - 1252 -de_LU -German (Luxembourg) -windows-1252 - -OS Locale (lcid: 1009): English (Canada) - 1252 -en_CA -English (Canada) -windows-1252 - -OS Locale (lcid: 100a): Spanish (Guatemala) - 1252 -es_GT -Spanish (Guatemala) -windows-1252 - -OS Locale (lcid: 100c): French (Switzerland) - 1252 -fr_CH -French (Switzerland) -windows-1252 - -OS Locale (lcid: 101a): Croatian (Latin) (Bosnia and Herzegovina) - 1250 -hr_BA -Croatian (Bosnia and Herzegovina) -windows-1250 - -OS Locale (lcid: 103b): Sami (Lule) (Norway) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 1401): Arabic (Algeria) - 1256 -ar_DZ -Arabic (Algeria) -windows-1256 - -OS Locale (lcid: 1404): Chinese (Macao S.A.R.) - 950 -zh_MO -Chinese (Macao) -x-windows-950 - -OS Locale (lcid: 1407): German (Liechtenstein) - 1252 -de_LI -German (Liechtenstein) -windows-1252 - -OS Locale (lcid: 1409): English (New Zealand) - 1252 -en_NZ -English (New Zealand) -windows-1252 - -OS Locale (lcid: 140a): Spanish (Costa Rica) - 1252 -es_CR -Spanish (Costa Rica) -windows-1252 - -OS Locale (lcid: 140c): French (Luxembourg) - 1252 -fr_LU -French (Luxembourg) -windows-1252 - -OS Locale (lcid: 141a): Bosnian (Latin) (Bosnia and Herzegovina) - 1250 -bs_BA -Bosnian (Bosnia and Herzegovina) -windows-1250 - -OS Locale (lcid: 143b): Sami (Lule) (Sweden) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 1801): Arabic (Morocco) - 1256 -ar_MA -Arabic (Morocco) -windows-1256 - -OS Locale (lcid: 1809): English (Ireland) - 1252 -en_IE -English (Ireland) -windows-1252 - -OS Locale (lcid: 180a): Spanish (Panama) - 1252 -es_PA -Spanish (Panama) -windows-1252 - -OS Locale (lcid: 180c): French (Principality of Monaco) - 1252 -fr_MC -French (Monaco) -windows-1252 - -OS Locale (lcid: 181a): Serbian (Latin) (Bosnia and Herzegovina) - 1250 -sr_BA -Serbian (Bosnia and Herzegovina) -windows-1250 - -OS Locale (lcid: 183b): Sami (Southern) (Norway) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 1c01): Arabic (Tunisia) - 1256 -ar_TN -Arabic (Tunisia) -windows-1256 - -OS Locale (lcid: 1c09): English (South Africa) - 1252 -en_ZA -English (South Africa) -windows-1252 - -OS Locale (lcid: 1c0a): Spanish (Dominican Republic) - 1252 -es_DO -Spanish (Dominican Republic) -windows-1252 - -OS Locale (lcid: 1c1a): Serbian (Cyrillic) (Bosnia and Herzegovina) - 1251 -sr_BA -Serbian (Bosnia and Herzegovina) -windows-1251 - -OS Locale (lcid: 1c3b): Sami (Southern) (Sweden) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 2001): Arabic (Oman) - 1256 -ar_OM -Arabic (Oman) -windows-1256 - -OS Locale (lcid: 2009): English (Jamaica) - 1252 -en_JM -English (Jamaica) -windows-1252 - -OS Locale (lcid: 200a): Spanish (Venezuela) - 1252 -es_VE -Spanish (Venezuela) -windows-1252 - -OS Locale (lcid: 201a): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1251 -bs_BA -Bosnian (Bosnia and Herzegovina) -windows-1250 - -OS Locale (lcid: 203b): Sami (Skolt) (Finland) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 2401): Arabic (Yemen) - 1256 -ar_YE -Arabic (Yemen) -windows-1256 - -OS Locale (lcid: 2409): English (Caribbean) - 1252 -en -English -windows-1252 - -OS Locale (lcid: 240a): Spanish (Colombia) - 1252 -es_CO -Spanish (Colombia) -windows-1252 - -OS Locale (lcid: 243b): Sami (Inari) (Finland) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 2801): Arabic (Syria) - 1256 -ar_SY -Arabic (Syria) -windows-1256 - -OS Locale (lcid: 2809): English (Belize) - 1252 -en_BZ -English (Belize) -windows-1252 - -OS Locale (lcid: 280a): Spanish (Peru) - 1252 -es_PE -Spanish (Peru) -windows-1252 - -OS Locale (lcid: 2c01): Arabic (Jordan) - 1256 -ar_JO -Arabic (Jordan) -windows-1256 - -OS Locale (lcid: 2c09): English (Trinidad and Tobago) - 1252 -en_TT -English (Trinidad and Tobago) -windows-1252 - -OS Locale (lcid: 2c0a): Spanish (Argentina) - 1252 -es_AR -Spanish (Argentina) -windows-1252 - -OS Locale (lcid: 3001): Arabic (Lebanon) - 1256 -ar_LB -Arabic (Lebanon) -windows-1256 - -OS Locale (lcid: 3009): English (Zimbabwe) - 1252 -en_ZW -English (Zimbabwe) -windows-1252 - -OS Locale (lcid: 300a): Spanish (Ecuador) - 1252 -es_EC -Spanish (Ecuador) -windows-1252 - -OS Locale (lcid: 3401): Arabic (Kuwait) - 1256 -ar_KW -Arabic (Kuwait) -windows-1256 - -OS Locale (lcid: 3409): English (Republic of the Philippines) - 1252 -en_PH -English (Philippines) -windows-1252 - -OS Locale (lcid: 340a): Spanish (Chile) - 1252 -es_CL -Spanish (Chile) -windows-1252 - -OS Locale (lcid: 3801): Arabic (U.A.E.) - 1256 -ar_AE -Arabic (United Arab Emirates) -windows-1256 - -OS Locale (lcid: 380a): Spanish (Uruguay) - 1252 -es_UY -Spanish (Uruguay) -windows-1252 - -OS Locale (lcid: 3c01): Arabic (Bahrain) - 1256 -ar_BH -Arabic (Bahrain) -windows-1256 - -OS Locale (lcid: 3c0a): Spanish (Paraguay) - 1252 -es_PY -Spanish (Paraguay) -windows-1252 - -OS Locale (lcid: 4001): Arabic (Qatar) - 1256 -ar_QA -Arabic (Qatar) -windows-1256 - -OS Locale (lcid: 4009): English (India) - 1252 -en_IN -English (India) -windows-1252 - -OS Locale (lcid: 400a): Spanish (Bolivia) - 1252 -es_BO -Spanish (Bolivia) -windows-1252 - -OS Locale (lcid: 4409): English (Malaysia) - 1252 -en_MY -English (Malaysia) -windows-1252 - -OS Locale (lcid: 440a): Spanish (El Salvador) - 1252 -es_SV -Spanish (El Salvador) -windows-1252 - -OS Locale (lcid: 4809): English (Singapore) - 1252 -en_SG -English (Singapore) -windows-1252 - -OS Locale (lcid: 480a): Spanish (Honduras) - 1252 -es_HN -Spanish (Honduras) -windows-1252 - -OS Locale (lcid: 4c0a): Spanish (Nicaragua) - 1252 -es_NI -Spanish (Nicaragua) -windows-1252 - -OS Locale (lcid: 500a): Spanish (Puerto Rico) - 1252 -es_PR -Spanish (Puerto Rico) -windows-1252 - -OS Locale (lcid: 540a): Spanish (United States) - 1252 -es_US -Spanish (United States) -windows-1252 diff --git a/jdk/test/java/util/Locale/data/deflocale.winxp b/jdk/test/java/util/Locale/data/deflocale.winxp deleted file mode 100644 index c516de50449..00000000000 --- a/jdk/test/java/util/Locale/data/deflocale.winxp +++ /dev/null @@ -1,861 +0,0 @@ -# OSVersionInfo -# MajorVersion: 5 -# MinorVersion: 1 -# BuildNumber: 2600 -# CSDVersion: Service Pack 2 - - -OS Locale (lcid: 401): Arabic (Saudi Arabia) - 1256 -ar_SA -Arabic (Saudi Arabia) -windows-1256 - -OS Locale (lcid: 402): Bulgarian (Bulgaria) - 1251 -bg_BG -Bulgarian (Bulgaria) -windows-1251 - -OS Locale (lcid: 403): Catalan (Spain) - 1252 -ca_ES -Catalan (Spain) -windows-1252 - -OS Locale (lcid: 404): Chinese (Taiwan) - 950 -zh_TW -Chinese (Taiwan) -x-windows-950 - -OS Locale (lcid: 405): Czech (Czech Republic) - 1250 -cs_CZ -Czech (Czech Republic) -windows-1250 - -OS Locale (lcid: 406): Danish (Denmark) - 1252 -da_DK -Danish (Denmark) -windows-1252 - -OS Locale (lcid: 407): German (Germany) - 1252 -de_DE -German (Germany) -windows-1252 - -OS Locale (lcid: 408): Greek (Greece) - 1253 -el_GR -Greek (Greece) -windows-1253 - -OS Locale (lcid: 409): English (United States) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 40a): Spanish (Spain) - 1252 -es_ES -Spanish (Spain) -windows-1252 - -OS Locale (lcid: 40b): Finnish (Finland) - 1252 -fi_FI -Finnish (Finland) -windows-1252 - -OS Locale (lcid: 40c): French (France) - 1252 -fr_FR -French (France) -windows-1252 - -OS Locale (lcid: 40d): Hebrew (Israel) - 1255 -iw_IL -Hebrew (Israel) -windows-1255 - -OS Locale (lcid: 40e): Hungarian (Hungary) - 1250 -hu_HU -Hungarian (Hungary) -windows-1250 - -OS Locale (lcid: 40f): Icelandic (Iceland) - 1252 -is_IS -Icelandic (Iceland) -windows-1252 - -OS Locale (lcid: 410): Italian (Italy) - 1252 -it_IT -Italian (Italy) -windows-1252 - -OS Locale (lcid: 411): Japanese (Japan) - 932 -ja_JP -Japanese (Japan) -windows-31j - -OS Locale (lcid: 412): Korean (Korea) - 949 -ko_KR -Korean (South Korea) -x-windows-949 - -OS Locale (lcid: 413): Dutch (Netherlands) - 1252 -nl_NL -Dutch (Netherlands) -windows-1252 - -OS Locale (lcid: 414): Norwegian (Bokmål) (Norway) - 1252 -no_NO -Norwegian (Norway) -windows-1252 - -OS Locale (lcid: 415): Polish (Poland) - 1250 -pl_PL -Polish (Poland) -windows-1250 - -OS Locale (lcid: 416): Portuguese (Brazil) - 1252 -pt_BR -Portuguese (Brazil) -windows-1252 - -OS Locale (lcid: 417): Romansh (Switzerland) - 1252 -rm_CH -Raeto-Romance (Switzerland) -windows-1252 - -OS Locale (lcid: 418): Romanian (Romania) - 1250 -ro_RO -Romanian (Romania) -windows-1250 - -OS Locale (lcid: 419): Russian (Russia) - 1251 -ru_RU -Russian (Russia) -windows-1251 - -OS Locale (lcid: 41a): Croatian (Croatia) - 1250 -hr_HR -Croatian (Croatia) -windows-1250 - -OS Locale (lcid: 41b): Slovak (Slovakia) - 1250 -sk_SK -Slovak (Slovakia) -windows-1250 - -OS Locale (lcid: 41c): Albanian (Albania) - 1250 -sq_AL -Albanian (Albania) -windows-1250 - -OS Locale (lcid: 41d): Swedish (Sweden) - 1252 -sv_SE -Swedish (Sweden) -windows-1252 - -OS Locale (lcid: 41e): Thai (Thailand) - 874 -th_TH -Thai (Thailand) -x-windows-874 - -OS Locale (lcid: 41f): Turkish (Turkey) - 1254 -tr_TR -Turkish (Turkey) -windows-1254 - -OS Locale (lcid: 420): Urdu (Islamic Republic of Pakistan) - 1256 -ur_PK -Urdu (Pakistan) -windows-1256 - -OS Locale (lcid: 421): Indonesian (Indonesia) - 1252 -in_ID -Indonesian (Indonesia) -windows-1252 - -OS Locale (lcid: 422): Ukrainian (Ukraine) - 1251 -uk_UA -Ukrainian (Ukraine) -windows-1251 - -OS Locale (lcid: 423): Belarusian (Belarus) - 1251 -be_BY -Belarusian (Belarus) -windows-1251 - -OS Locale (lcid: 424): Slovenian (Slovenia) - 1250 -sl_SI -Slovenian (Slovenia) -windows-1250 - -OS Locale (lcid: 425): Estonian (Estonia) - 1257 -et_EE -Estonian (Estonia) -windows-1257 - -OS Locale (lcid: 426): Latvian (Latvia) - 1257 -lv_LV -Latvian (Latvia) -windows-1257 - -OS Locale (lcid: 427): Lithuanian (Lithuania) - 1257 -lt_LT -Lithuanian (Lithuania) -windows-1257 - -OS Locale (lcid: 429): Farsi (Iran) - 1256 -fa_IR -Persian (Iran) -windows-1256 - -OS Locale (lcid: 42a): Vietnamese (Viet Nam) - 1258 -vi_VN -Vietnamese (Vietnam) -windows-1258 - -OS Locale (lcid: 42b): Armenian (Armenia) - 0 -hy_AM -Armenian (Armenia) -UTF-8 - -OS Locale (lcid: 42c): Azeri (Latin) (Azerbaijan) - 1254 -az_AZ -Azerbaijani (Azerbaijan) -windows-1254 - -OS Locale (lcid: 42d): Basque (Spain) - 1252 -eu_ES -Basque (Spain) -windows-1252 - -OS Locale (lcid: 42f): FYRO Macedonian (Former Yugoslav Republic of Macedonia) - 1251 -mk_MK -Macedonian (Macedonia) -windows-1251 - -OS Locale (lcid: 432): Tswana (South Africa) - 1252 -tn_ZA -Tswana (South Africa) -windows-1252 - -OS Locale (lcid: 434): Xhosa (South Africa) - 1252 -xh_ZA -Xhosa (South Africa) -windows-1252 - -OS Locale (lcid: 435): Zulu (South Africa) - 1252 -zu_ZA -Zulu (South Africa) -windows-1252 - -OS Locale (lcid: 436): Afrikaans (South Africa) - 1252 -af_ZA -Afrikaans (South Africa) -windows-1252 - -OS Locale (lcid: 437): Georgian (Georgia) - 0 -ka_GE -Georgian (Georgia) -UTF-8 - -OS Locale (lcid: 438): Faroese (Faroe Islands) - 1252 -fo_FO -Faroese (Faroe Islands) -windows-1252 - -OS Locale (lcid: 439): Hindi (India) - 0 -hi_IN -Hindi (India) -UTF-8 - -OS Locale (lcid: 43a): Maltese (Malta) - 0 -mt_MT -Maltese (Malta) -UTF-8 - -OS Locale (lcid: 43b): Sami (Northern) (Norway) - 1252 -se_NO -Northern Sami (Norway) -windows-1252 - -OS Locale (lcid: 43e): Malay (Malaysia) - 1252 -ms_MY -Malay (Malaysia) -windows-1252 - -OS Locale (lcid: 43f): Kazakh (Kazakhstan) - 1251 -kk_KZ -Kazakh (Kazakhstan) -windows-1251 - -OS Locale (lcid: 440): Kyrgyz (Kyrgyzstan) - 1251 -ky_KG -Kirghiz (Kyrgyzstan) -windows-1251 - -OS Locale (lcid: 441): Swahili (Kenya) - 1252 -sw_KE -Swahili (Kenya) -windows-1252 - -OS Locale (lcid: 443): Uzbek (Latin) (Uzbekistan) - 1254 -uz_UZ -Uzbek (Uzbekistan) -windows-1254 - -OS Locale (lcid: 444): Tatar (Russia) - 1251 -tt_RU -Tatar (Russia) -windows-1251 - -OS Locale (lcid: 445): Bengali (India) - 0 -bn_IN -Bengali (India) -UTF-8 - -OS Locale (lcid: 446): Punjabi (India) - 0 -pa_IN -Panjabi (India) -UTF-8 - -OS Locale (lcid: 447): Gujarati (India) - 0 -gu_IN -Gujarati (India) -UTF-8 - -OS Locale (lcid: 449): Tamil (India) - 0 -ta_IN -Tamil (India) -UTF-8 - -OS Locale (lcid: 44a): Telugu (India) - 0 -te_IN -Telugu (India) -UTF-8 - -OS Locale (lcid: 44b): Kannada (India) - 0 -kn_IN -Kannada (India) -UTF-8 - -OS Locale (lcid: 44c): Malayalam (India) - 0 -ml_IN -Malayalam (India) -UTF-8 - -OS Locale (lcid: 44e): Marathi (India) - 0 -mr_IN -Marathi (India) -UTF-8 - -OS Locale (lcid: 44f): Sanskrit (India) - 0 -sa_IN -Sanskrit (India) -UTF-8 - -OS Locale (lcid: 450): Mongolian (Mongolia) - 1251 -mn_MN -Mongolian (Mongolia) -windows-1251 - -OS Locale (lcid: 452): Welsh (United Kingdom) - 1252 -cy_GB -Welsh (United Kingdom) -windows-1252 - -OS Locale (lcid: 456): Galician (Spain) - 1252 -gl_ES -Gallegan (Spain) -windows-1252 - -OS Locale (lcid: 457): Konkani (India) - 0 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 45a): Syriac (Syria) - 0 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 461): Nepali (Nepal) - 0 -ne_NP -Nepali (Nepal) -UTF-8 - -OS Locale (lcid: 462): Frisian (Netherlands) - 1252 -fy_NL -Frisian (Netherlands) -windows-1252 - -OS Locale (lcid: 463): Pashto (Afghanistan) - 1256 -ps_AF -Pushto (Afghanistan) -windows-1256 - -OS Locale (lcid: 464): Filipino (Philippines) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 465): Divehi (Maldives) - 0 -dv_MV -Divehi (Maldives) -UTF-8 - -OS Locale (lcid: 46b): Quechua (Bolivia) - 1252 -qu_BO -Quechua (Bolivia) -windows-1252 - -OS Locale (lcid: 46c): Northern Sotho (South Africa) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 46e): Luxembourgish (Luxembourg) - 1252 -lb_LU -Luxembourgish (Luxembourg) -windows-1252 - -OS Locale (lcid: 47a): Mapudungun (Chile) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 47c): Mohawk (Canada) - 1252 -en_US -English (United States) -windows-1252 - -OS Locale (lcid: 481): Maori (New Zealand) - 0 -mi_NZ -Maori (New Zealand) -UTF-8 - -OS Locale (lcid: 801): Arabic (Iraq) - 1256 -ar_IQ -Arabic (Iraq) -windows-1256 - -OS Locale (lcid: 804): Chinese (People's Republic of China) - 936 -zh_CN -Chinese (China) -GBK - -OS Locale (lcid: 807): German (Switzerland) - 1252 -de_CH -German (Switzerland) -windows-1252 - -OS Locale (lcid: 809): English (United Kingdom) - 1252 -en_GB -English (United Kingdom) -windows-1252 - -OS Locale (lcid: 80a): Spanish (Mexico) - 1252 -es_MX -Spanish (Mexico) -windows-1252 - -OS Locale (lcid: 80c): French (Belgium) - 1252 -fr_BE -French (Belgium) -windows-1252 - -OS Locale (lcid: 810): Italian (Switzerland) - 1252 -it_CH -Italian (Switzerland) -windows-1252 - -OS Locale (lcid: 813): Dutch (Belgium) - 1252 -nl_BE -Dutch (Belgium) -windows-1252 - -OS Locale (lcid: 814): Norwegian (Nynorsk) (Norway) - 1252 -no_NO_NY -Norwegian (Norway,Nynorsk) -windows-1252 - -OS Locale (lcid: 816): Portuguese (Portugal) - 1252 -pt_PT -Portuguese (Portugal) -windows-1252 - -OS Locale (lcid: 81a): Serbian (Latin) (Serbia and Montenegro) - 1250 -sr_CS -Serbian (Serbia and Montenegro) -windows-1250 - -OS Locale (lcid: 81d): Swedish (Finland) - 1252 -sv_FI -Swedish (Finland) -windows-1252 - -OS Locale (lcid: 82c): Azeri (Cyrillic) (Azerbaijan) - 1251 -az_AZ -Azerbaijani (Azerbaijan) -windows-1251 - -OS Locale (lcid: 83b): Sami (Northern) (Sweden) - 1252 -se_SE -Northern Sami (Sweden) -windows-1252 - -OS Locale (lcid: 83c): Irish (Ireland) - 1252 -ga_IE -Irish (Ireland) -windows-1252 - -OS Locale (lcid: 83e): Malay (Brunei Darussalam) - 1252 -ms_BN -Malay (Brunei) -windows-1252 - -OS Locale (lcid: 843): Uzbek (Cyrillic) (Uzbekistan) - 1251 -uz_UZ -Uzbek (Uzbekistan) -windows-1251 - -OS Locale (lcid: 85d): Inuktitut (Latin) (Canada) - 1252 -iu_CA -Inuktitut (Canada) -windows-1252 - -OS Locale (lcid: 86b): Quechua (Ecuador) - 1252 -qu_EC -Quechua (Ecuador) -windows-1252 - -OS Locale (lcid: c01): Arabic (Egypt) - 1256 -ar_EG -Arabic (Egypt) -windows-1256 - -OS Locale (lcid: c04): Chinese (Hong Kong S.A.R.) - 950 -zh_HK -Chinese (Hong Kong) -x-windows-950 - -OS Locale (lcid: c07): German (Austria) - 1252 -de_AT -German (Austria) -windows-1252 - -OS Locale (lcid: c09): English (Australia) - 1252 -en_AU -English (Australia) -windows-1252 - -OS Locale (lcid: c0a): Spanish (Spain) - 1252 -es_ES -Spanish (Spain) -windows-1252 - -OS Locale (lcid: c0c): French (Canada) - 1252 -fr_CA -French (Canada) -windows-1252 - -OS Locale (lcid: c1a): Serbian (Cyrillic) (Serbia and Montenegro) - 1251 -sr_CS -Serbian (Serbia and Montenegro) -windows-1251 - -OS Locale (lcid: c3b): Sami (Northern) (Finland) - 1252 -se_FI -Northern Sami (Finland) -windows-1252 - -OS Locale (lcid: c6b): Quechua (Peru) - 1252 -qu_PE -Quechua (Peru) -windows-1252 - -OS Locale (lcid: 1001): Arabic (Libya) - 1256 -ar_LY -Arabic (Libya) -windows-1256 - -OS Locale (lcid: 1004): Chinese (Singapore) - 936 -zh_SG -Chinese (Singapore) -GBK - -OS Locale (lcid: 1007): German (Luxembourg) - 1252 -de_LU -German (Luxembourg) -windows-1252 - -OS Locale (lcid: 1009): English (Canada) - 1252 -en_CA -English (Canada) -windows-1252 - -OS Locale (lcid: 100a): Spanish (Guatemala) - 1252 -es_GT -Spanish (Guatemala) -windows-1252 - -OS Locale (lcid: 100c): French (Switzerland) - 1252 -fr_CH -French (Switzerland) -windows-1252 - -OS Locale (lcid: 101a): Croatian (Bosnia and Herzegovina) - 1250 -hr_BA -Croatian (Bosnia and Herzegovina) -windows-1250 - -OS Locale (lcid: 103b): Sami (Lule) (Norway) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 1401): Arabic (Algeria) - 1256 -ar_DZ -Arabic (Algeria) -windows-1256 - -OS Locale (lcid: 1404): Chinese (Macau S.A.R.) - 950 -zh_MO -Chinese (Macao) -x-windows-950 - -OS Locale (lcid: 1407): German (Liechtenstein) - 1252 -de_LI -German (Liechtenstein) -windows-1252 - -OS Locale (lcid: 1409): English (New Zealand) - 1252 -en_NZ -English (New Zealand) -windows-1252 - -OS Locale (lcid: 140a): Spanish (Costa Rica) - 1252 -es_CR -Spanish (Costa Rica) -windows-1252 - -OS Locale (lcid: 140c): French (Luxembourg) - 1252 -fr_LU -French (Luxembourg) -windows-1252 - -OS Locale (lcid: 141a): Bosnian (Bosnia and Herzegovina) - 1250 -bs_BA -Bosnian (Bosnia and Herzegovina) -windows-1250 - -OS Locale (lcid: 143b): Sami (Lule) (Sweden) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 1801): Arabic (Morocco) - 1256 -ar_MA -Arabic (Morocco) -windows-1256 - -OS Locale (lcid: 1809): English (Ireland) - 1252 -en_IE -English (Ireland) -windows-1252 - -OS Locale (lcid: 180a): Spanish (Panama) - 1252 -es_PA -Spanish (Panama) -windows-1252 - -OS Locale (lcid: 180c): French (Principality of Monaco) - 1252 -fr_MC -French (Monaco) -windows-1252 - -OS Locale (lcid: 181a): Serbian (Latin) (Bosnia and Herzegovina) - 1250 -sr_BA -Serbian (Bosnia and Herzegovina) -windows-1250 - -OS Locale (lcid: 183b): Sami (Southern) (Norway) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 1c01): Arabic (Tunisia) - 1256 -ar_TN -Arabic (Tunisia) -windows-1256 - -OS Locale (lcid: 1c09): English (South Africa) - 1252 -en_ZA -English (South Africa) -windows-1252 - -OS Locale (lcid: 1c0a): Spanish (Dominican Republic) - 1252 -es_DO -Spanish (Dominican Republic) -windows-1252 - -OS Locale (lcid: 1c1a): Serbian (Cyrillic) (Bosnia and Herzegovina) - 1251 -sr_BA -Serbian (Bosnia and Herzegovina) -windows-1251 - -OS Locale (lcid: 1c3b): Sami (Southern) (Sweden) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 2001): Arabic (Oman) - 1256 -ar_OM -Arabic (Oman) -windows-1256 - -OS Locale (lcid: 2009): English (Jamaica) - 1252 -en_JM -English (Jamaica) -windows-1252 - -OS Locale (lcid: 200a): Spanish (Venezuela) - 1252 -es_VE -Spanish (Venezuela) -windows-1252 - -OS Locale (lcid: 201a): Bosnian (Cyrillic) (Bosnia and Herzegovina) - 1250 -bs_BA -Bosnian (Bosnia and Herzegovina) -windows-1250 - -OS Locale (lcid: 203b): Sami (Skolt) (Finland) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 2401): Arabic (Yemen) - 1256 -ar_YE -Arabic (Yemen) -windows-1256 - -OS Locale (lcid: 2409): English (Caribbean) - 1252 -en -English -windows-1252 - -OS Locale (lcid: 240a): Spanish (Colombia) - 1252 -es_CO -Spanish (Colombia) -windows-1252 - -OS Locale (lcid: 243b): Sami (Inari) (Finland) - 1252 -se -Northern Sami -windows-1252 - -OS Locale (lcid: 2801): Arabic (Syria) - 1256 -ar_SY -Arabic (Syria) -windows-1256 - -OS Locale (lcid: 2809): English (Belize) - 1252 -en_BZ -English (Belize) -windows-1252 - -OS Locale (lcid: 280a): Spanish (Peru) - 1252 -es_PE -Spanish (Peru) -windows-1252 - -OS Locale (lcid: 2c01): Arabic (Jordan) - 1256 -ar_JO -Arabic (Jordan) -windows-1256 - -OS Locale (lcid: 2c09): English (Trinidad and Tobago) - 1252 -en_TT -English (Trinidad and Tobago) -windows-1252 - -OS Locale (lcid: 2c0a): Spanish (Argentina) - 1252 -es_AR -Spanish (Argentina) -windows-1252 - -OS Locale (lcid: 3001): Arabic (Lebanon) - 1256 -ar_LB -Arabic (Lebanon) -windows-1256 - -OS Locale (lcid: 3009): English (Zimbabwe) - 1252 -en_ZW -English (Zimbabwe) -windows-1252 - -OS Locale (lcid: 300a): Spanish (Ecuador) - 1252 -es_EC -Spanish (Ecuador) -windows-1252 - -OS Locale (lcid: 3401): Arabic (Kuwait) - 1256 -ar_KW -Arabic (Kuwait) -windows-1256 - -OS Locale (lcid: 3409): English (Republic of the Philippines) - 1252 -en_PH -English (Philippines) -windows-1252 - -OS Locale (lcid: 340a): Spanish (Chile) - 1252 -es_CL -Spanish (Chile) -windows-1252 - -OS Locale (lcid: 3801): Arabic (U.A.E.) - 1256 -ar_AE -Arabic (United Arab Emirates) -windows-1256 - -OS Locale (lcid: 380a): Spanish (Uruguay) - 1252 -es_UY -Spanish (Uruguay) -windows-1252 - -OS Locale (lcid: 3c01): Arabic (Bahrain) - 1256 -ar_BH -Arabic (Bahrain) -windows-1256 - -OS Locale (lcid: 3c0a): Spanish (Paraguay) - 1252 -es_PY -Spanish (Paraguay) -windows-1252 - -OS Locale (lcid: 4001): Arabic (Qatar) - 1256 -ar_QA -Arabic (Qatar) -windows-1256 - -OS Locale (lcid: 400a): Spanish (Bolivia) - 1252 -es_BO -Spanish (Bolivia) -windows-1252 - -OS Locale (lcid: 440a): Spanish (El Salvador) - 1252 -es_SV -Spanish (El Salvador) -windows-1252 - -OS Locale (lcid: 480a): Spanish (Honduras) - 1252 -es_HN -Spanish (Honduras) -windows-1252 - -OS Locale (lcid: 4c0a): Spanish (Nicaragua) - 1252 -es_NI -Spanish (Nicaragua) -windows-1252 - -OS Locale (lcid: 500a): Spanish (Puerto Rico) - 1252 -es_PR -Spanish (Puerto Rico) -windows-1252 From d950166573199f6b5d5de26b7a1f03cd41434924 Mon Sep 17 00:00:00 2001 From: Masayoshi Okutsu Date: Wed, 1 Sep 2010 15:19:13 +0900 Subject: [PATCH 024/128] 4267450: (cal) API: Need public API to calculate, format and parse "year of week" 6549953: (cal) WEEK_OF_YEAR and DAY_OF_YEAR calculation problems around Gregorian cutover Reviewed-by: peytoia --- jdk/make/java/text/base/FILES_java.gmk | 3 +- .../classes/java/text/CalendarBuilder.java | 170 ++++++++ .../classes/java/text/DateFormatSymbols.java | 33 +- .../classes/java/text/SimpleDateFormat.java | 311 ++++++++------ jdk/src/share/classes/java/util/Calendar.java | 99 ++++- .../classes/java/util/GregorianCalendar.java | 405 ++++++++++++++---- .../text/Format/DateFormat/WeekDateTest.java | 166 +++++++ jdk/test/java/util/Calendar/WeekDateTest.java | 133 ++++++ 8 files changed, 1105 insertions(+), 215 deletions(-) create mode 100644 jdk/src/share/classes/java/text/CalendarBuilder.java create mode 100644 jdk/test/java/text/Format/DateFormat/WeekDateTest.java create mode 100644 jdk/test/java/util/Calendar/WeekDateTest.java diff --git a/jdk/make/java/text/base/FILES_java.gmk b/jdk/make/java/text/base/FILES_java.gmk index 414390822c3..8d721300c27 100644 --- a/jdk/make/java/text/base/FILES_java.gmk +++ b/jdk/make/java/text/base/FILES_java.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ FILES_java = \ java/text/AttributedString.java \ java/text/BreakDictionary.java \ java/text/BreakIterator.java \ + java/text/CalendarBuilder.java \ java/text/CharacterIterator.java \ java/text/CharacterIteratorFieldDelegate.java \ java/text/ChoiceFormat.java \ diff --git a/jdk/src/share/classes/java/text/CalendarBuilder.java b/jdk/src/share/classes/java/text/CalendarBuilder.java new file mode 100644 index 00000000000..0b73cd2ba90 --- /dev/null +++ b/jdk/src/share/classes/java/text/CalendarBuilder.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.text; + +import java.util.Calendar; +import static java.util.GregorianCalendar.*; + +/** + * {@code CalendarBuilder} keeps field-value pairs for setting + * the calendar fields of the given {@code Calendar}. It has the + * {@link Calendar#FIELD_COUNT FIELD_COUNT}-th field for the week year + * support. Also {@code ISO_DAY_OF_WEEK} is used to specify + * {@code DAY_OF_WEEK} in the ISO day of week numbering. + * + *

{@code CalendarBuilder} retains the semantic of the pseudo + * timestamp for fields. {@code CalendarBuilder} uses a single + * int array combining fields[] and stamp[] of {@code Calendar}. + * + * @author Masayoshi Okutsu + */ +class CalendarBuilder { + /* + * Pseudo time stamp constants used in java.util.Calendar + */ + private static final int UNSET = 0; + private static final int COMPUTED = 1; + private static final int MINIMUM_USER_STAMP = 2; + + private static final int MAX_FIELD = FIELD_COUNT + 1; + + public static final int WEEK_YEAR = FIELD_COUNT; + public static final int ISO_DAY_OF_WEEK = 1000; // pseudo field index + + // stamp[] (lower half) and field[] (upper half) combined + private final int[] field; + private int nextStamp; + private int maxFieldIndex; + + CalendarBuilder() { + field = new int[MAX_FIELD * 2]; + nextStamp = MINIMUM_USER_STAMP; + maxFieldIndex = -1; + } + + CalendarBuilder set(int index, int value) { + if (index == ISO_DAY_OF_WEEK) { + index = DAY_OF_WEEK; + value = toCalendarDayOfWeek(value); + } + field[index] = nextStamp++; + field[MAX_FIELD + index] = value; + if (index > maxFieldIndex && index < FIELD_COUNT) { + maxFieldIndex = index; + } + return this; + } + + CalendarBuilder addYear(int value) { + field[MAX_FIELD + YEAR] += value; + field[MAX_FIELD + WEEK_YEAR] += value; + return this; + } + + boolean isSet(int index) { + if (index == ISO_DAY_OF_WEEK) { + index = DAY_OF_WEEK; + } + return field[index] > UNSET; + } + + Calendar establish(Calendar cal) { + boolean weekDate = isSet(WEEK_YEAR) + && field[WEEK_YEAR] > field[YEAR]; + if (weekDate && !cal.isWeekDateSupported()) { + // Use YEAR instead + if (!isSet(YEAR)) { + set(YEAR, field[MAX_FIELD + WEEK_YEAR]); + } + weekDate = false; + } + + cal.clear(); + // Set the fields from the min stamp to the max stamp so that + // the field resolution works in the Calendar. + for (int stamp = MINIMUM_USER_STAMP; stamp < nextStamp; stamp++) { + for (int index = 0; index <= maxFieldIndex; index++) { + if (field[index] == stamp) { + cal.set(index, field[MAX_FIELD + index]); + break; + } + } + } + + if (weekDate) { + int weekOfYear = isSet(WEEK_OF_YEAR) ? field[MAX_FIELD + WEEK_OF_YEAR] : 1; + int dayOfWeek = isSet(DAY_OF_WEEK) ? + field[MAX_FIELD + DAY_OF_WEEK] : cal.getFirstDayOfWeek(); + if (!isValidDayOfWeek(dayOfWeek) && cal.isLenient()) { + if (dayOfWeek >= 8) { + dayOfWeek--; + weekOfYear += dayOfWeek / 7; + dayOfWeek = (dayOfWeek % 7) + 1; + } else { + while (dayOfWeek <= 0) { + dayOfWeek += 7; + weekOfYear--; + } + } + dayOfWeek = toCalendarDayOfWeek(dayOfWeek); + } + cal.setWeekDate(field[MAX_FIELD + WEEK_YEAR], weekOfYear, dayOfWeek); + } + return cal; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("CalendarBuilder:["); + for (int i = 0; i < field.length; i++) { + if (isSet(i)) { + sb.append(i).append('=').append(field[MAX_FIELD + i]).append(','); + } + } + int lastIndex = sb.length() - 1; + if (sb.charAt(lastIndex) == ',') { + sb.setLength(lastIndex); + } + sb.append(']'); + return sb.toString(); + } + + static int toISODayOfWeek(int calendarDayOfWeek) { + return calendarDayOfWeek == SUNDAY ? 7 : calendarDayOfWeek - 1; + } + + static int toCalendarDayOfWeek(int isoDayOfWeek) { + if (!isValidDayOfWeek(isoDayOfWeek)) { + // adjust later for lenient mode + return isoDayOfWeek; + } + return isoDayOfWeek == 7 ? SUNDAY : isoDayOfWeek + 1; + } + + static boolean isValidDayOfWeek(int dayOfWeek) { + return dayOfWeek > 0 && dayOfWeek <= 7; + } +} diff --git a/jdk/src/share/classes/java/text/DateFormatSymbols.java b/jdk/src/share/classes/java/text/DateFormatSymbols.java index 4776ead6991..180dffdf677 100644 --- a/jdk/src/share/classes/java/text/DateFormatSymbols.java +++ b/jdk/src/share/classes/java/text/DateFormatSymbols.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -226,7 +226,29 @@ public class DateFormatSymbols implements Serializable, Cloneable { * Unlocalized date-time pattern characters. For example: 'y', 'd', etc. * All locales use the same these unlocalized pattern characters. */ - static final String patternChars = "GyMdkHmsSEDFwWahKzZ"; + static final String patternChars = "GyMdkHmsSEDFwWahKzZYu"; + + static final int PATTERN_ERA = 0; // G + static final int PATTERN_YEAR = 1; // y + static final int PATTERN_MONTH = 2; // M + static final int PATTERN_DAY_OF_MONTH = 3; // d + static final int PATTERN_HOUR_OF_DAY1 = 4; // k + static final int PATTERN_HOUR_OF_DAY0 = 5; // H + static final int PATTERN_MINUTE = 6; // m + static final int PATTERN_SECOND = 7; // s + static final int PATTERN_MILLISECOND = 8; // S + static final int PATTERN_DAY_OF_WEEK = 9; // E + static final int PATTERN_DAY_OF_YEAR = 10; // D + static final int PATTERN_DAY_OF_WEEK_IN_MONTH = 11; // F + static final int PATTERN_WEEK_OF_YEAR = 12; // w + static final int PATTERN_WEEK_OF_MONTH = 13; // W + static final int PATTERN_AM_PM = 14; // a + static final int PATTERN_HOUR1 = 15; // h + static final int PATTERN_HOUR0 = 16; // K + static final int PATTERN_ZONE_NAME = 17; // z + static final int PATTERN_ZONE_VALUE = 18; // Z + static final int PATTERN_WEEK_YEAR = 19; // Y + static final int PATTERN_ISO_DAY_OF_WEEK = 20; // u /** * Localized date-time pattern characters. For example, a locale may @@ -505,7 +527,7 @@ public class DateFormatSymbols implements Serializable, Cloneable { * @return the localized date-time pattern characters. */ public String getLocalPatternChars() { - return new String(localPatternChars); + return localPatternChars; } /** @@ -514,7 +536,8 @@ public class DateFormatSymbols implements Serializable, Cloneable { * pattern characters. */ public void setLocalPatternChars(String newLocalPatternChars) { - localPatternChars = new String(newLocalPatternChars); + // Call toString() to throw an NPE in case the argument is null + localPatternChars = newLocalPatternChars.toString(); } /** @@ -699,7 +722,7 @@ public class DateFormatSymbols implements Serializable, Cloneable { } else { dst.zoneStrings = null; } - dst.localPatternChars = new String (src.localPatternChars); + dst.localPatternChars = src.localPatternChars; } /** diff --git a/jdk/src/share/classes/java/text/SimpleDateFormat.java b/jdk/src/share/classes/java/text/SimpleDateFormat.java index 91f35c9cde4..66fc84734a8 100644 --- a/jdk/src/share/classes/java/text/SimpleDateFormat.java +++ b/jdk/src/share/classes/java/text/SimpleDateFormat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,6 +55,8 @@ import sun.util.calendar.CalendarUtils; import sun.util.calendar.ZoneInfoFile; import sun.util.resources.LocaleData; +import static java.text.DateFormatSymbols.*; + /** * SimpleDateFormat is a concrete class for formatting and * parsing dates in a locale-sensitive manner. It allows for formatting @@ -108,40 +110,50 @@ import sun.util.resources.LocaleData; * Year * 1996; 96 * + * Y + * Week year + * Year + * 2009; 09 + * * M * Month in year * Month * July; Jul; 07 - * + * * w * Week in year * Number * 27 - * + * * W * Week in month * Number * 2 - * + * * D * Day in year * Number * 189 - * + * * d * Day in month * Number * 10 - * + * * F * Day of week in month * Number * 2 - * + * * E - * Day in week + * Day name in week * Text * Tuesday; Tue + * + * u + * Day number of week (1 = Monday, ..., 7 = Sunday) + * Number + * 1 * * a * Am/pm marker @@ -202,12 +214,12 @@ import sun.util.resources.LocaleData; * the full form is used; otherwise a short or abbreviated form * is used if available. * For parsing, both forms are accepted, independent of the number - * of pattern letters. + * of pattern letters.

*

  • Number: * For formatting, the number of pattern letters is the minimum * number of digits, and shorter numbers are zero-padded to this amount. * For parsing, the number of pattern letters is ignored unless - * it's needed to separate two adjacent fields. + * it's needed to separate two adjacent fields.

  • *
  • Year: * If the formatter's {@link #getCalendar() Calendar} is the Gregorian * calendar, the following rules are applied.
    @@ -239,11 +251,20 @@ import sun.util.resources.LocaleData; * letters is 4 or more, a calendar specific {@linkplain * Calendar#LONG long form} is used. Otherwise, a calendar * specific {@linkplain Calendar#SHORT short or abbreviated form} - * is used. + * is used.
    + *
    + * If week year {@code 'Y'} is specified and the {@linkplain + * #getCalendar() calendar} doesn't support any week + * years, the calendar year ({@code 'y'}) is used instead. The + * support of week years can be tested with a call to {@link + * DateFormat#getCalendar() getCalendar()}.{@link + * java.util.Calendar#isWeekDateSupported() + * isWeekDateSupported()}.

  • *
  • Month: * If the number of pattern letters is 3 or more, the month is * interpreted as text; otherwise, - * it is interpreted as a number. + * it is interpreted as a number.

  • *
  • General time zone: * Time zones are interpreted as text if they have * names. For time zones representing a GMT offset value, the @@ -264,7 +285,7 @@ import sun.util.resources.LocaleData; * 00 and 59. The format is locale independent and digits must be taken * from the Basic Latin block of the Unicode standard. *

    For parsing, RFC 822 time zones are also - * accepted. + * accepted.

  • *
  • RFC 822 time zone: * For formatting, the RFC 822 4-digit time zone format is used: *
    @@ -321,6 +342,9 @@ import sun.util.resources.LocaleData;
      *     
      *         "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
      *         2001-07-04T12:08:56.235-0700
    + *     
    + *         "YYYY-'W'ww-u"
    + *         2001-W27-3
      * 
      * 
      *
    @@ -877,7 +901,7 @@ public class SimpleDateFormat extends DateFormat {
          * @param pos the formatting position. On input: an alignment field,
          * if desired. On output: the offsets of the alignment field.
          * @return the formatted date-time string.
    -     * @exception NullPointerException if the given date is null
    +     * @exception NullPointerException if the given {@code date} is {@code null}.
          */
         public StringBuffer format(Date date, StringBuffer toAppendTo,
                                    FieldPosition pos)
    @@ -968,7 +992,10 @@ public class SimpleDateFormat extends DateFormat {
             Calendar.DAY_OF_YEAR, Calendar.DAY_OF_WEEK_IN_MONTH,
             Calendar.WEEK_OF_YEAR, Calendar.WEEK_OF_MONTH,
             Calendar.AM_PM, Calendar.HOUR, Calendar.HOUR, Calendar.ZONE_OFFSET,
    -        Calendar.ZONE_OFFSET
    +        Calendar.ZONE_OFFSET,
    +        // Pseudo Calendar fields
    +        CalendarBuilder.WEEK_YEAR,
    +        CalendarBuilder.ISO_DAY_OF_WEEK
         };
     
         // Map index into pattern character string to DateFormat field number
    @@ -982,6 +1009,7 @@ public class SimpleDateFormat extends DateFormat {
             DateFormat.WEEK_OF_MONTH_FIELD, DateFormat.AM_PM_FIELD,
             DateFormat.HOUR1_FIELD, DateFormat.HOUR0_FIELD,
             DateFormat.TIMEZONE_FIELD, DateFormat.TIMEZONE_FIELD,
    +        DateFormat.YEAR_FIELD, DateFormat.DAY_OF_WEEK_FIELD
         };
     
         // Maps from DecimalFormatSymbols index to Field constant
    @@ -993,6 +1021,7 @@ public class SimpleDateFormat extends DateFormat {
             Field.WEEK_OF_YEAR, Field.WEEK_OF_MONTH,
             Field.AM_PM, Field.HOUR1, Field.HOUR0, Field.TIME_ZONE,
             Field.TIME_ZONE,
    +        Field.YEAR, Field.DAY_OF_WEEK
         };
     
         /**
    @@ -1007,9 +1036,24 @@ public class SimpleDateFormat extends DateFormat {
             int     beginOffset = buffer.length();
     
             int field = PATTERN_INDEX_TO_CALENDAR_FIELD[patternCharIndex];
    -        int value = calendar.get(field);
    +        int value;
    +        if (field == CalendarBuilder.WEEK_YEAR) {
    +            if (calendar.isWeekDateSupported()) {
    +                value = calendar.getWeekYear();
    +            } else {
    +                // use calendar year 'y' instead
    +                patternCharIndex = PATTERN_YEAR;
    +                field = PATTERN_INDEX_TO_CALENDAR_FIELD[patternCharIndex];
    +                value = calendar.get(field);
    +            }
    +        } else if (field == CalendarBuilder.ISO_DAY_OF_WEEK) {
    +            value = CalendarBuilder.toISODayOfWeek(calendar.get(Calendar.DAY_OF_WEEK));
    +        } else {
    +            value = calendar.get(field);
    +        }
    +
             int style = (count >= 4) ? Calendar.LONG : Calendar.SHORT;
    -        if (!useDateFormatSymbols) {
    +        if (!useDateFormatSymbols && field != CalendarBuilder.ISO_DAY_OF_WEEK) {
                 current = calendar.getDisplayName(field, style, locale);
             }
     
    @@ -1018,7 +1062,7 @@ public class SimpleDateFormat extends DateFormat {
             // zeroPaddingNumber() must be fixed.
     
             switch (patternCharIndex) {
    -        case 0: // 'G' - ERA
    +        case PATTERN_ERA: // 'G'
                 if (useDateFormatSymbols) {
                     String[] eras = formatData.getEras();
                     if (value < eras.length)
    @@ -1028,7 +1072,8 @@ public class SimpleDateFormat extends DateFormat {
                     current = "";
                 break;
     
    -        case 1: // 'y' - YEAR
    +        case PATTERN_WEEK_YEAR: // 'Y'
    +        case PATTERN_YEAR:      // 'y'
                 if (calendar instanceof GregorianCalendar) {
                     if (count != 2)
                         zeroPaddingNumber(value, count, maxIntCount, buffer);
    @@ -1042,7 +1087,7 @@ public class SimpleDateFormat extends DateFormat {
                 }
                 break;
     
    -        case 2: // 'M' - MONTH
    +        case PATTERN_MONTH: // 'M'
                 if (useDateFormatSymbols) {
                     String[] months;
                     if (count >= 4) {
    @@ -1062,7 +1107,7 @@ public class SimpleDateFormat extends DateFormat {
                 }
                 break;
     
    -        case 4: // 'k' - HOUR_OF_DAY: 1-based.  eg, 23:59 + 1 hour =>> 24:59
    +        case PATTERN_HOUR_OF_DAY1: // 'k' 1-based.  eg, 23:59 + 1 hour =>> 24:59
                 if (current == null) {
                     if (value == 0)
                         zeroPaddingNumber(calendar.getMaximum(Calendar.HOUR_OF_DAY)+1,
    @@ -1072,7 +1117,7 @@ public class SimpleDateFormat extends DateFormat {
                 }
                 break;
     
    -        case 9: // 'E' - DAY_OF_WEEK
    +        case PATTERN_DAY_OF_WEEK: // 'E'
                 if (useDateFormatSymbols) {
                     String[] weekdays;
                     if (count >= 4) {
    @@ -1085,14 +1130,14 @@ public class SimpleDateFormat extends DateFormat {
                 }
                 break;
     
    -        case 14:    // 'a' - AM_PM
    +        case PATTERN_AM_PM:    // 'a'
                 if (useDateFormatSymbols) {
                     String[] ampm = formatData.getAmPmStrings();
                     current = ampm[value];
                 }
                 break;
     
    -        case 15: // 'h' - HOUR:1-based.  eg, 11PM + 1 hour =>> 12 AM
    +        case PATTERN_HOUR1:    // 'h' 1-based.  eg, 11PM + 1 hour =>> 12 AM
                 if (current == null) {
                     if (value == 0)
                         zeroPaddingNumber(calendar.getLeastMaximum(Calendar.HOUR)+1,
    @@ -1102,7 +1147,7 @@ public class SimpleDateFormat extends DateFormat {
                 }
                 break;
     
    -        case 17: // 'z' - ZONE_OFFSET
    +        case PATTERN_ZONE_NAME: // 'z'
                 if (current == null) {
                     if (formatData.locale == null || formatData.isZoneStringsSet) {
                         int zoneIndex =
    @@ -1129,7 +1174,7 @@ public class SimpleDateFormat extends DateFormat {
                 }
                 break;
     
    -        case 18: // 'Z' - ZONE_OFFSET ("-/+hhmm" form)
    +        case PATTERN_ZONE_VALUE: // 'Z' ("-/+hhmm" form)
                 value = (calendar.get(Calendar.ZONE_OFFSET) +
                          calendar.get(Calendar.DST_OFFSET)) / 60000;
     
    @@ -1145,16 +1190,17 @@ public class SimpleDateFormat extends DateFormat {
                 break;
     
             default:
    -            // case 3: // 'd' - DATE
    -            // case 5: // 'H' - HOUR_OF_DAY:0-based.  eg, 23:59 + 1 hour =>> 00:59
    -            // case 6: // 'm' - MINUTE
    -            // case 7: // 's' - SECOND
    -            // case 8: // 'S' - MILLISECOND
    -            // case 10: // 'D' - DAY_OF_YEAR
    -            // case 11: // 'F' - DAY_OF_WEEK_IN_MONTH
    -            // case 12: // 'w' - WEEK_OF_YEAR
    -            // case 13: // 'W' - WEEK_OF_MONTH
    -            // case 16: // 'K' - HOUR: 0-based.  eg, 11PM + 1 hour =>> 0 AM
    +     // case PATTERN_DAY_OF_MONTH:         // 'd'
    +     // case PATTERN_HOUR_OF_DAY0:         // 'H' 0-based.  eg, 23:59 + 1 hour =>> 00:59
    +     // case PATTERN_MINUTE:               // 'm'
    +     // case PATTERN_SECOND:               // 's'
    +     // case PATTERN_MILLISECOND:          // 'S'
    +     // case PATTERN_DAY_OF_YEAR:          // 'D'
    +     // case PATTERN_DAY_OF_WEEK_IN_MONTH: // 'F'
    +     // case PATTERN_WEEK_OF_YEAR:         // 'w'
    +     // case PATTERN_WEEK_OF_MONTH:        // 'W'
    +     // case PATTERN_HOUR0:                // 'K' eg, 11PM + 1 hour =>> 0 AM
    +     // case PATTERN_ISO_DAY_OF_WEEK:      // 'u' pseudo field, Monday = 1, ..., Sunday = 7
                 if (current == null) {
                     zeroPaddingNumber(value, count, maxIntCount, buffer);
                 }
    @@ -1264,10 +1310,9 @@ public class SimpleDateFormat extends DateFormat {
             int oldStart = start;
             int textLength = text.length();
     
    -        calendar.clear(); // Clears all the time fields
    -
             boolean[] ambiguousYear = {false};
     
    +        CalendarBuilder calb = new CalendarBuilder();
     
             for (int i = 0; i < compiledPattern.length; ) {
                 int tag = compiledPattern[i] >>> 8;
    @@ -1340,7 +1385,7 @@ public class SimpleDateFormat extends DateFormat {
                     }
                     start = subParse(text, start, tag, count, obeyCount,
                                      ambiguousYear, pos,
    -                                 useFollowingMinusSignAsDelimiter);
    +                                 useFollowingMinusSignAsDelimiter, calb);
                     if (start < 0) {
                         pos.index = oldStart;
                         return null;
    @@ -1354,46 +1399,16 @@ public class SimpleDateFormat extends DateFormat {
     
             pos.index = start;
     
    -        // This part is a problem:  When we call parsedDate.after, we compute the time.
    -        // Take the date April 3 2004 at 2:30 am.  When this is first set up, the year
    -        // will be wrong if we're parsing a 2-digit year pattern.  It will be 1904.
    -        // April 3 1904 is a Sunday (unlike 2004) so it is the DST onset day.  2:30 am
    -        // is therefore an "impossible" time, since the time goes from 1:59 to 3:00 am
    -        // on that day.  It is therefore parsed out to fields as 3:30 am.  Then we
    -        // add 100 years, and get April 3 2004 at 3:30 am.  Note that April 3 2004 is
    -        // a Saturday, so it can have a 2:30 am -- and it should. [LIU]
    -        /*
    -        Date parsedDate = calendar.getTime();
    -        if( ambiguousYear[0] && !parsedDate.after(defaultCenturyStart) ) {
    -            calendar.add(Calendar.YEAR, 100);
    -            parsedDate = calendar.getTime();
    -        }
    -        */
    -        // Because of the above condition, save off the fields in case we need to readjust.
    -        // The procedure we use here is not particularly efficient, but there is no other
    -        // way to do this given the API restrictions present in Calendar.  We minimize
    -        // inefficiency by only performing this computation when it might apply, that is,
    -        // when the two-digit year is equal to the start year, and thus might fall at the
    -        // front or the back of the default century.  This only works because we adjust
    -        // the year correctly to start with in other cases -- see subParse().
             Date parsedDate;
             try {
    -            if (ambiguousYear[0]) // If this is true then the two-digit year == the default start year
    -            {
    -                // We need a copy of the fields, and we need to avoid triggering a call to
    -                // complete(), which will recalculate the fields.  Since we can't access
    -                // the fields[] array in Calendar, we clone the entire object.  This will
    -                // stop working if Calendar.clone() is ever rewritten to call complete().
    -                Calendar savedCalendar = (Calendar)calendar.clone();
    -                parsedDate = calendar.getTime();
    -                if (parsedDate.before(defaultCenturyStart))
    -                {
    -                    // We can't use add here because that does a complete() first.
    -                    savedCalendar.set(Calendar.YEAR, defaultCenturyStartYear + 100);
    -                    parsedDate = savedCalendar.getTime();
    +            parsedDate = calb.establish(calendar).getTime();
    +            // If the year value is ambiguous,
    +            // then the two-digit year == the default start year
    +            if (ambiguousYear[0]) {
    +                if (parsedDate.before(defaultCenturyStart)) {
    +                    parsedDate = calb.addYear(100).establish(calendar).getTime();
                     }
                 }
    -            else parsedDate = calendar.getTime();
             }
             // An IllegalArgumentException will be thrown by Calendar.getTime()
             // if any fields are out of range, e.g., MONTH == 17.
    @@ -1415,7 +1430,7 @@ public class SimpleDateFormat extends DateFormat {
          * @return the new start position if matching succeeded; a negative number
          * indicating matching failure, otherwise.
          */
    -    private int matchString(String text, int start, int field, String[] data)
    +    private int matchString(String text, int start, int field, String[] data, CalendarBuilder calb)
         {
             int i = 0;
             int count = data.length;
    @@ -1441,7 +1456,7 @@ public class SimpleDateFormat extends DateFormat {
             }
             if (bestMatch >= 0)
             {
    -            calendar.set(field, bestMatch);
    +            calb.set(field, bestMatch);
                 return start + bestMatchLength;
             }
             return -start;
    @@ -1452,7 +1467,8 @@ public class SimpleDateFormat extends DateFormat {
          * String[]). This method takes a Map instead of
          * String[].
          */
    -    private int matchString(String text, int start, int field, Map data) {
    +    private int matchString(String text, int start, int field,
    +                            Map data, CalendarBuilder calb) {
             if (data != null) {
                 String bestMatch = null;
     
    @@ -1466,7 +1482,7 @@ public class SimpleDateFormat extends DateFormat {
                 }
     
                 if (bestMatch != null) {
    -                calendar.set(field, data.get(bestMatch));
    +                calb.set(field, data.get(bestMatch));
                     return start + bestMatch.length();
                 }
             }
    @@ -1486,11 +1502,22 @@ public class SimpleDateFormat extends DateFormat {
             return -1;
         }
     
    +    private boolean matchDSTString(String text, int start, int zoneIndex, int standardIndex,
    +                                   String[][] zoneStrings) {
    +        int index = standardIndex + 2;
    +        String zoneName  = zoneStrings[zoneIndex][index];
    +        if (text.regionMatches(true, start,
    +                               zoneName, 0, zoneName.length())) {
    +            return true;
    +        }
    +        return false;
    +    }
    +
         /**
          * find time zone 'text' matched zoneStrings and set to internal
          * calendar.
          */
    -    private int subParseZoneString(String text, int start) {
    +    private int subParseZoneString(String text, int start, CalendarBuilder calb) {
             boolean useSameName = false; // true if standard and daylight time use the same abbreviation.
             TimeZone currentTimeZone = getTimeZone();
     
    @@ -1524,6 +1551,7 @@ public class SimpleDateFormat extends DateFormat {
                     }
                 }
             }
    +
             if (tz == null) {
                 int len = zoneStrings.length;
                 for (int i = 0; i < len; i++) {
    @@ -1549,8 +1577,8 @@ public class SimpleDateFormat extends DateFormat {
                 // determine the local time. (6645292)
                 int dstAmount = (nameIndex >= 3) ? tz.getDSTSavings() : 0;
                 if (!(useSameName || (nameIndex >= 3 && dstAmount == 0))) {
    -                calendar.set(Calendar.ZONE_OFFSET, tz.getRawOffset());
    -                calendar.set(Calendar.DST_OFFSET, dstAmount);
    +                calb.set(Calendar.ZONE_OFFSET, tz.getRawOffset())
    +                    .set(Calendar.DST_OFFSET, dstAmount);
                 }
                 return (start + zoneNames[nameIndex].length());
             }
    @@ -1577,11 +1605,15 @@ public class SimpleDateFormat extends DateFormat {
         private int subParse(String text, int start, int patternCharIndex, int count,
                              boolean obeyCount, boolean[] ambiguousYear,
                              ParsePosition origPos,
    -                         boolean useFollowingMinusSignAsDelimiter) {
    +                         boolean useFollowingMinusSignAsDelimiter, CalendarBuilder calb) {
             Number number = null;
             int value = 0;
             ParsePosition pos = new ParsePosition(0);
             pos.index = start;
    +        if (patternCharIndex == PATTERN_WEEK_YEAR && !calendar.isWeekDateSupported()) {
    +            // use calendar year 'y' instead
    +            patternCharIndex = PATTERN_YEAR;
    +        }
             int field = PATTERN_INDEX_TO_CALENDAR_FIELD[patternCharIndex];
     
             // If there are any spaces here, skip over them.  If we hit the end
    @@ -1602,10 +1634,11 @@ public class SimpleDateFormat extends DateFormat {
                 // a number value.  We handle further, more generic cases below.  We need
                 // to handle some of them here because some fields require extra processing on
                 // the parsed value.
    -            if (patternCharIndex == 4 /* HOUR_OF_DAY1_FIELD */ ||
    -                patternCharIndex == 15 /* HOUR1_FIELD */ ||
    -                (patternCharIndex == 2 /* MONTH_FIELD */ && count <= 2) ||
    -                patternCharIndex == 1 /* YEAR_FIELD */) {
    +            if (patternCharIndex == PATTERN_HOUR_OF_DAY1 ||
    +                patternCharIndex == PATTERN_HOUR1 ||
    +                (patternCharIndex == PATTERN_MONTH && count <= 2) ||
    +                patternCharIndex == PATTERN_YEAR ||
    +                patternCharIndex == PATTERN_WEEK_YEAR) {
                     // It would be good to unify this with the obeyCount logic below,
                     // but that's going to be difficult.
                     if (obeyCount) {
    @@ -1617,7 +1650,7 @@ public class SimpleDateFormat extends DateFormat {
                         number = numberFormat.parse(text, pos);
                     }
                     if (number == null) {
    -                    if (patternCharIndex != 1 || calendar instanceof GregorianCalendar) {
    +                    if (patternCharIndex != PATTERN_YEAR || calendar instanceof GregorianCalendar) {
                             break parsing;
                         }
                     } else {
    @@ -1638,33 +1671,34 @@ public class SimpleDateFormat extends DateFormat {
     
                 int index;
                 switch (patternCharIndex) {
    -            case 0: // 'G' - ERA
    +            case PATTERN_ERA: // 'G'
                     if (useDateFormatSymbols) {
    -                    if ((index = matchString(text, start, Calendar.ERA, formatData.getEras())) > 0) {
    +                    if ((index = matchString(text, start, Calendar.ERA, formatData.getEras(), calb)) > 0) {
                             return index;
                         }
                     } else {
                         Map map = calendar.getDisplayNames(field,
                                                                             Calendar.ALL_STYLES,
                                                                             locale);
    -                    if ((index = matchString(text, start, field, map)) > 0) {
    +                    if ((index = matchString(text, start, field, map, calb)) > 0) {
                             return index;
                         }
                     }
                     break parsing;
     
    -            case 1: // 'y' - YEAR
    +            case PATTERN_WEEK_YEAR: // 'Y'
    +            case PATTERN_YEAR:      // 'y'
                     if (!(calendar instanceof GregorianCalendar)) {
                         // calendar might have text representations for year values,
                         // such as "\u5143" in JapaneseImperialCalendar.
                         int style = (count >= 4) ? Calendar.LONG : Calendar.SHORT;
                         Map map = calendar.getDisplayNames(field, style, locale);
                         if (map != null) {
    -                        if ((index = matchString(text, start, field, map)) > 0) {
    +                        if ((index = matchString(text, start, field, map, calb)) > 0) {
                                 return index;
                             }
                         }
    -                    calendar.set(field, value);
    +                    calb.set(field, value);
                         return pos.index;
                     }
     
    @@ -1676,8 +1710,7 @@ public class SimpleDateFormat extends DateFormat {
                     // is treated literally:  "2250", "-1", "1", "002".
                     if (count <= 2 && (pos.index - start) == 2
                         && Character.isDigit(text.charAt(start))
    -                    && Character.isDigit(text.charAt(start+1)))
    -                {
    +                    && Character.isDigit(text.charAt(start+1))) {
                         // Assume for example that the defaultCenturyStart is 6/18/1903.
                         // This means that two-digit years will be forced into the range
                         // 6/18/1903 to 6/17/2003.  As a result, years 00, 01, and 02
    @@ -1691,16 +1724,16 @@ public class SimpleDateFormat extends DateFormat {
                         value += (defaultCenturyStartYear/100)*100 +
                             (value < ambiguousTwoDigitYear ? 100 : 0);
                     }
    -                calendar.set(Calendar.YEAR, value);
    +                calb.set(field, value);
                     return pos.index;
     
    -            case 2: // 'M' - MONTH
    +            case PATTERN_MONTH: // 'M'
                     if (count <= 2) // i.e., M or MM.
                     {
                         // Don't want to parse the month if it is a string
                         // while pattern uses numeric style: M or MM.
                         // [We computed 'value' above.]
    -                    calendar.set(Calendar.MONTH, value - 1);
    +                    calb.set(Calendar.MONTH, value - 1);
                         return pos.index;
                     }
     
    @@ -1710,50 +1743,50 @@ public class SimpleDateFormat extends DateFormat {
                         // Try count == 4 first:
                         int newStart = 0;
                         if ((newStart = matchString(text, start, Calendar.MONTH,
    -                                                formatData.getMonths())) > 0) {
    +                                                formatData.getMonths(), calb)) > 0) {
                             return newStart;
                         }
                         // count == 4 failed, now try count == 3
                         if ((index = matchString(text, start, Calendar.MONTH,
    -                                             formatData.getShortMonths())) > 0) {
    +                                             formatData.getShortMonths(), calb)) > 0) {
                             return index;
                         }
                     } else {
                         Map map = calendar.getDisplayNames(field,
                                                                             Calendar.ALL_STYLES,
                                                                             locale);
    -                    if ((index = matchString(text, start, field, map)) > 0) {
    +                    if ((index = matchString(text, start, field, map, calb)) > 0) {
                             return index;
                         }
                     }
                     break parsing;
     
    -            case 4: // 'k' - HOUR_OF_DAY: 1-based.  eg, 23:59 + 1 hour =>> 24:59
    +            case PATTERN_HOUR_OF_DAY1: // 'k' 1-based.  eg, 23:59 + 1 hour =>> 24:59
                     // [We computed 'value' above.]
                     if (value == calendar.getMaximum(Calendar.HOUR_OF_DAY)+1) value = 0;
    -                calendar.set(Calendar.HOUR_OF_DAY, value);
    +                calb.set(Calendar.HOUR_OF_DAY, value);
                     return pos.index;
     
    -            case 9:
    -                { // 'E' - DAY_OF_WEEK
    +            case PATTERN_DAY_OF_WEEK:  // 'E'
    +                {
                         if (useDateFormatSymbols) {
                             // Want to be able to parse both short and long forms.
                             // Try count == 4 (DDDD) first:
                             int newStart = 0;
                             if ((newStart=matchString(text, start, Calendar.DAY_OF_WEEK,
    -                                                  formatData.getWeekdays())) > 0) {
    +                                                  formatData.getWeekdays(), calb)) > 0) {
                                 return newStart;
                             }
                             // DDDD failed, now try DDD
                             if ((index = matchString(text, start, Calendar.DAY_OF_WEEK,
    -                                                 formatData.getShortWeekdays())) > 0) {
    +                                                 formatData.getShortWeekdays(), calb)) > 0) {
                                 return index;
                             }
                         } else {
                             int[] styles = { Calendar.LONG, Calendar.SHORT };
                             for (int style : styles) {
                                 Map map = calendar.getDisplayNames(field, style, locale);
    -                            if ((index = matchString(text, start, field, map)) > 0) {
    +                            if ((index = matchString(text, start, field, map, calb)) > 0) {
                                     return index;
                                 }
                             }
    @@ -1761,27 +1794,28 @@ public class SimpleDateFormat extends DateFormat {
                     }
                     break parsing;
     
    -            case 14:    // 'a' - AM_PM
    +            case PATTERN_AM_PM:    // 'a'
                     if (useDateFormatSymbols) {
    -                    if ((index = matchString(text, start, Calendar.AM_PM, formatData.getAmPmStrings())) > 0) {
    +                    if ((index = matchString(text, start, Calendar.AM_PM,
    +                                             formatData.getAmPmStrings(), calb)) > 0) {
                             return index;
                         }
                     } else {
                         Map map = calendar.getDisplayNames(field, Calendar.ALL_STYLES, locale);
    -                    if ((index = matchString(text, start, field, map)) > 0) {
    +                    if ((index = matchString(text, start, field, map, calb)) > 0) {
                             return index;
                         }
                     }
                     break parsing;
     
    -            case 15: // 'h' - HOUR:1-based.  eg, 11PM + 1 hour =>> 12 AM
    +            case PATTERN_HOUR1: // 'h' 1-based.  eg, 11PM + 1 hour =>> 12 AM
                     // [We computed 'value' above.]
                     if (value == calendar.getLeastMaximum(Calendar.HOUR)+1) value = 0;
    -                calendar.set(Calendar.HOUR, value);
    +                calb.set(Calendar.HOUR, value);
                     return pos.index;
     
    -            case 17: // 'z' - ZONE_OFFSET
    -            case 18: // 'Z' - ZONE_OFFSET
    +            case PATTERN_ZONE_NAME:  // 'z'
    +            case PATTERN_ZONE_VALUE: // 'Z'
                     // First try to parse generic forms such as GMT-07:00. Do this first
                     // in case localized TimeZoneNames contains the string "GMT"
                     // for a zone; in that case, we don't want to match the first three
    @@ -1797,7 +1831,7 @@ public class SimpleDateFormat extends DateFormat {
                         if ((text.length() - start) >= GMT.length() &&
                             text.regionMatches(true, start, GMT, 0, GMT.length())) {
                             int num;
    -                        calendar.set(Calendar.DST_OFFSET, 0);
    +                        calb.set(Calendar.DST_OFFSET, 0);
                             pos.index = start + GMT.length();
     
                             try { // try-catch for "GMT" only time zone string
    @@ -1810,8 +1844,8 @@ public class SimpleDateFormat extends DateFormat {
                             }
                             catch(StringIndexOutOfBoundsException e) {}
     
    -                        if (sign == 0) {        /* "GMT" without offset */
    -                            calendar.set(Calendar.ZONE_OFFSET, 0);
    +                        if (sign == 0) {    /* "GMT" without offset */
    +                            calb.set(Calendar.ZONE_OFFSET, 0);
                                 return pos.index;
                             }
     
    @@ -1875,7 +1909,7 @@ public class SimpleDateFormat extends DateFormat {
                                     sign = -1;
                                 } else {
                                     // Try parsing the text as a time zone name (abbr).
    -                                int i = subParseZoneString(text, pos.index);
    +                                int i = subParseZoneString(text, pos.index, calb);
                                     if (i != 0) {
                                         return i;
                                     }
    @@ -1933,24 +1967,24 @@ public class SimpleDateFormat extends DateFormat {
                         // arrive here if the form GMT+/-... or an RFC 822 form was seen.
                         if (sign != 0) {
                             offset *= MILLIS_PER_MINUTE * sign;
    -                        calendar.set(Calendar.ZONE_OFFSET, offset);
    -                        calendar.set(Calendar.DST_OFFSET, 0);
    +                        calb.set(Calendar.ZONE_OFFSET, offset).set(Calendar.DST_OFFSET, 0);
                             return ++pos.index;
                         }
                     }
                     break parsing;
     
                 default:
    -                // case 3: // 'd' - DATE
    -                // case 5: // 'H' - HOUR_OF_DAY:0-based.  eg, 23:59 + 1 hour =>> 00:59
    -                // case 6: // 'm' - MINUTE
    -                // case 7: // 's' - SECOND
    -                // case 8: // 'S' - MILLISECOND
    -                // case 10: // 'D' - DAY_OF_YEAR
    -                // case 11: // 'F' - DAY_OF_WEEK_IN_MONTH
    -                // case 12: // 'w' - WEEK_OF_YEAR
    -                // case 13: // 'W' - WEEK_OF_MONTH
    -                // case 16: // 'K' - HOUR: 0-based.  eg, 11PM + 1 hour =>> 0 AM
    +         // case PATTERN_DAY_OF_MONTH:         // 'd'
    +         // case PATTERN_HOUR_OF_DAY0:         // 'H' 0-based.  eg, 23:59 + 1 hour =>> 00:59
    +         // case PATTERN_MINUTE:               // 'm'
    +         // case PATTERN_SECOND:               // 's'
    +         // case PATTERN_MILLISECOND:          // 'S'
    +         // case PATTERN_DAY_OF_YEAR:          // 'D'
    +         // case PATTERN_DAY_OF_WEEK_IN_MONTH: // 'F'
    +         // case PATTERN_WEEK_OF_YEAR:         // 'w'
    +         // case PATTERN_WEEK_OF_MONTH:        // 'W'
    +         // case PATTERN_HOUR0:                // 'K' 0-based.  eg, 11PM + 1 hour =>> 0 AM
    +         // case PATTERN_ISO_DAY_OF_WEEK:      // 'u' (pseudo field);
     
                     // Handle "generic" fields
                     if (obeyCount) {
    @@ -1973,7 +2007,7 @@ public class SimpleDateFormat extends DateFormat {
                             pos.index--;
                         }
     
    -                    calendar.set(field, value);
    +                    calb.set(field, value);
                         return pos.index;
                     }
                     break parsing;
    @@ -2020,11 +2054,18 @@ public class SimpleDateFormat extends DateFormat {
                         inQuote = true;
                     else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                         int ci = from.indexOf(c);
    -                    if (ci == -1)
    +                    if (ci >= 0) {
    +                        // patternChars is longer than localPatternChars due
    +                        // to serialization compatibility. The pattern letters
    +                        // unsupported by localPatternChars pass through.
    +                        if (ci < to.length()) {
    +                            c = to.charAt(ci);
    +                        }
    +                    } else {
                             throw new IllegalArgumentException("Illegal pattern " +
                                                                " character '" +
                                                                c + "'");
    -                    c = to.charAt(ci);
    +                    }
                     }
                 }
                 result.append(c);
    diff --git a/jdk/src/share/classes/java/util/Calendar.java b/jdk/src/share/classes/java/util/Calendar.java
    index 3e7b9f6b1b8..1fb891cf7c4 100644
    --- a/jdk/src/share/classes/java/util/Calendar.java
    +++ b/jdk/src/share/classes/java/util/Calendar.java
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -119,7 +119,7 @@ import sun.util.resources.LocaleData;
      * calculating its time or calendar field values if any out-of-range field
      * value has been set.
      *
    - * 

    First Week

    + *

    First Week

    * * Calendar defines a locale-specific seven day week using two * parameters: the first day of the week and the minimal days in first week @@ -2195,6 +2195,101 @@ public abstract class Calendar implements Serializable, Cloneable, ComparableThe default implementation of this method returns {@code false}. + * + * @return {@code true} if this {@code Calendar} supports week dates; + * {@code false} otherwise. + * @see #getWeekYear() + * @see #setWeekDate(int,int,int) + * @see #getWeeksInWeekYear() + * @since 1.7 + */ + public boolean isWeekDateSupported() { + return false; + } + + /** + * Returns the week year represented by this {@code Calendar}. The + * week year is in sync with the week cycle. The {@linkplain + * #getFirstDayOfWeek() first day of the first week} is the first + * day of the week year. + * + *

    The default implementation of this method throws an + * {@link UnsupportedOperationException}. + * + * @return the week year of this {@code Calendar} + * @exception UnsupportedOperationException + * if any week year numbering isn't supported + * in this {@code Calendar}. + * @see #isWeekDateSupported() + * @see #getFirstDayOfWeek() + * @see #getMinimalDaysInFirstWeek() + * @since 1.7 + */ + public int getWeekYear() { + throw new UnsupportedOperationException(); + } + + /** + * Sets the date of this {@code Calendar} with the the given date + * specifiers - week year, week of year, and day of week. + * + *

    Unlike the {@code set} method, all of the calendar fields + * and {@code time} values are calculated upon return. + * + *

    If {@code weekOfYear} is out of the valid week-of-year range + * in {@code weekYear}, the {@code weekYear} and {@code + * weekOfYear} values are adjusted in lenient mode, or an {@code + * IllegalArgumentException} is thrown in non-lenient mode. + * + *

    The default implementation of this method throws an + * {@code UnsupportedOperationException}. + * + * @param weekYear the week year + * @param weekOfYear the week number based on {@code weekYear} + * @param dayOfWeek the day of week value: one of the constants + * for the {@link #DAY_OF_WEEK} field: {@link + * #SUNDAY}, ..., {@link #SATURDAY}. + * @exception IllegalArgumentException + * if any of the given date specifiers is invalid + * or any of the calendar fields are inconsistent + * with the given date specifiers in non-lenient mode + * @exception UnsupportedOperationException + * if any week year numbering isn't supported in this + * {@code Calendar}. + * @see #isWeekDateSupported() + * @see #getFirstDayOfWeek() + * @see #getMinimalDaysInFirstWeek() + * @since 1.7 + */ + public void setWeekDate(int weekYear, int weekOfYear, int dayOfWeek) { + throw new UnsupportedOperationException(); + } + + /** + * Returns the number of weeks in the week year represented by this + * {@code Calendar}. + * + *

    The default implementation of this method throws an + * {@code UnsupportedOperationException}. + * + * @return the number of weeks in the week year. + * @exception UnsupportedOperationException + * if any week year numbering isn't supported in this + * {@code Calendar}. + * @see #WEEK_OF_YEAR + * @see #isWeekDateSupported() + * @see #getWeekYear() + * @see #getActualMaximum(int) + * @since 1.7 + */ + public int getWeeksInWeekYear() { + throw new UnsupportedOperationException(); + } + /** * Returns the minimum value for the given calendar field of this * Calendar instance. The minimum value is defined as diff --git a/jdk/src/share/classes/java/util/GregorianCalendar.java b/jdk/src/share/classes/java/util/GregorianCalendar.java index b66d79f5308..a2459843c22 100644 --- a/jdk/src/share/classes/java/util/GregorianCalendar.java +++ b/jdk/src/share/classes/java/util/GregorianCalendar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,23 +88,49 @@ import sun.util.calendar.ZoneInfo; * adjustment may be made if desired for dates that are prior to the Gregorian * changeover and which fall between January 1 and March 24. * - *

    Values calculated for the WEEK_OF_YEAR field range from 1 to - * 53. Week 1 for a year is the earliest seven day period starting on - * getFirstDayOfWeek() that contains at least - * getMinimalDaysInFirstWeek() days from that year. It thus - * depends on the values of getMinimalDaysInFirstWeek(), - * getFirstDayOfWeek(), and the day of the week of January 1. - * Weeks between week 1 of one year and week 1 of the following year are - * numbered sequentially from 2 to 52 or 53 (as needed). - - *

    For example, January 1, 1998 was a Thursday. If - * getFirstDayOfWeek() is MONDAY and - * getMinimalDaysInFirstWeek() is 4 (these are the values - * reflecting ISO 8601 and many national standards), then week 1 of 1998 starts - * on December 29, 1997, and ends on January 4, 1998. If, however, - * getFirstDayOfWeek() is SUNDAY, then week 1 of 1998 - * starts on January 4, 1998, and ends on January 10, 1998; the first three days - * of 1998 then are part of week 53 of 1997. + *

    Week Of Year and Week Year

    + * + *

    Values calculated for the {@link Calendar#WEEK_OF_YEAR + * WEEK_OF_YEAR} field range from 1 to 53. The first week of a + * calendar year is the earliest seven day period starting on {@link + * Calendar#getFirstDayOfWeek() getFirstDayOfWeek()} that contains at + * least {@link Calendar#getMinimalDaysInFirstWeek() + * getMinimalDaysInFirstWeek()} days from that year. It thus depends + * on the values of {@code getMinimalDaysInFirstWeek()}, {@code + * getFirstDayOfWeek()}, and the day of the week of January 1. Weeks + * between week 1 of one year and week 1 of the following year + * (exclusive) are numbered sequentially from 2 to 52 or 53 (except + * for year(s) involved in the Julian-Gregorian transition). + * + *

    The {@code getFirstDayOfWeek()} and {@code + * getMinimalDaysInFirstWeek()} values are initialized using + * locale-dependent resources when constructing a {@code + * GregorianCalendar}. The week + * determination is compatible with the ISO 8601 standard when {@code + * getFirstDayOfWeek()} is {@code MONDAY} and {@code + * getMinimalDaysInFirstWeek()} is 4, which values are used in locales + * where the standard is preferred. These values can explicitly be set by + * calling {@link Calendar#setFirstDayOfWeek(int) setFirstDayOfWeek()} and + * {@link Calendar#setMinimalDaysInFirstWeek(int) + * setMinimalDaysInFirstWeek()}. + * + *

    A week year is in sync with a + * {@code WEEK_OF_YEAR} cycle. All weeks between the first and last + * weeks (inclusive) have the same week year value. + * Therefore, the first and last days of a week year may have + * different calendar year values. + * + *

    For example, January 1, 1998 is a Thursday. If {@code + * getFirstDayOfWeek()} is {@code MONDAY} and {@code + * getMinimalDaysInFirstWeek()} is 4 (ISO 8601 standard compatible + * setting), then week 1 of 1998 starts on December 29, 1997, and ends + * on January 4, 1998. The week year is 1998 for the last three days + * of calendar year 1997. If, however, {@code getFirstDayOfWeek()} is + * {@code SUNDAY}, then week 1 of 1998 starts on January 4, 1998, and + * ends on January 10, 1998; the first three days of 1998 then are + * part of week 53 of 1997 and their week year is 1997. + * + *

    Week Of Month

    * *

    Values calculated for the WEEK_OF_MONTH field range from 0 * to 6. Week 1 of a month (the days with WEEK_OF_MONTH = @@ -124,7 +150,9 @@ import sun.util.calendar.ZoneInfo; * getMinimalDaysInFirstWeek() is changed to 3, then January 1 * through January 3 have a WEEK_OF_MONTH of 1. * - *

    The clear methods set calendar field(s) + *

    Default Fields Values

    + * + *

    The clear method sets calendar field(s) * undefined. GregorianCalendar uses the following * default value for each calendar field if its value is undefined. * @@ -1625,6 +1653,13 @@ public class GregorianCalendar extends Calendar { * is 29 because 2004 is a leap year, and if the date of this * instance is February 1, 2005, it's 28. * + *

    This method calculates the maximum value of {@link + * Calendar#WEEK_OF_YEAR WEEK_OF_YEAR} based on the {@link + * Calendar#YEAR YEAR} (calendar year) value, not the week year. Call {@link + * #getWeeksInWeekYear()} to get the maximum value of {@code + * WEEK_OF_YEAR} in the week year of this {@code GregorianCalendar}. + * * @param field the calendar field * @return the maximum of the given field for the time value of * this GregorianCalendar @@ -1742,8 +1777,13 @@ public class GregorianCalendar extends Calendar { if (gc == this) { gc = (GregorianCalendar) gc.clone(); } - gc.set(DAY_OF_YEAR, getActualMaximum(DAY_OF_YEAR)); + int maxDayOfYear = getActualMaximum(DAY_OF_YEAR); + gc.set(DAY_OF_YEAR, maxDayOfYear); value = gc.get(WEEK_OF_YEAR); + if (internalGet(YEAR) != gc.getWeekYear()) { + gc.set(DAY_OF_YEAR, maxDayOfYear - 7); + value = gc.get(WEEK_OF_YEAR); + } } break; @@ -1934,46 +1974,239 @@ public class GregorianCalendar extends Calendar { } } -////////////////////// -// Proposed public API -////////////////////// + /** + * Returns {@code true} indicating this {@code GregorianCalendar} + * supports week dates. + * + * @return {@code true} (always) + * @see #getWeekYear() + * @see #setWeekDate(int,int,int) + * @see #getWeeksInWeekYear() + * @since 1.7 + */ + @Override + public final boolean isWeekDateSupported() { + return true; + } /** - * Returns the year that corresponds to the WEEK_OF_YEAR field. - * This may be one year before or after the Gregorian or Julian year stored - * in the YEAR field. For example, January 1, 1999 is considered - * Friday of week 53 of 1998 (if minimal days in first week is - * 2 or less, and the first day of the week is Sunday). Given - * these same settings, the ISO year of January 1, 1999 is - * 1998. + * Returns the week year represented by this + * {@code GregorianCalendar}. The dates in the weeks between 1 and the + * maximum week number of the week year have the same week year value + * that may be one year before or after the {@link Calendar#YEAR YEAR} + * (calendar year) value. * - *

    This method calls {@link Calendar#complete} before - * calculating the week-based year. + *

    This method calls {@link Calendar#complete()} before + * calculating the week year. * - * @return the year corresponding to the WEEK_OF_YEAR field, which - * may be one year before or after the YEAR field. - * @see #YEAR - * @see #WEEK_OF_YEAR + * @return the week year represented by this {@code GregorianCalendar}. + * If the {@link Calendar#ERA ERA} value is {@link #BC}, the year is + * represented by 0 or a negative number: BC 1 is 0, BC 2 + * is -1, BC 3 is -2, and so on. + * @throws IllegalArgumentException + * if any of the calendar fields is invalid in non-lenient mode. + * @see #isWeekDateSupported() + * @see #getWeeksInWeekYear() + * @see Calendar#getFirstDayOfWeek() + * @see Calendar#getMinimalDaysInFirstWeek() + * @since 1.7 */ - /* - public int getWeekBasedYear() { - complete(); - // TODO: Below doesn't work for gregorian cutover... - int weekOfYear = internalGet(WEEK_OF_YEAR); - int year = internalGet(YEAR); - if (internalGet(MONTH) == Calendar.JANUARY) { - if (weekOfYear >= 52) { + @Override + public int getWeekYear() { + int year = get(YEAR); // implicitly calls complete() + if (internalGetEra() == BCE) { + year = 1 - year; + } + + // Fast path for the Gregorian calendar years that are never + // affected by the Julian-Gregorian transition + if (year > gregorianCutoverYear + 1) { + int weekOfYear = internalGet(WEEK_OF_YEAR); + if (internalGet(MONTH) == JANUARY) { + if (weekOfYear >= 52) { + --year; + } + } else { + if (weekOfYear == 1) { + ++year; + } + } + return year; + } + + // General (slow) path + int dayOfYear = internalGet(DAY_OF_YEAR); + int maxDayOfYear = getActualMaximum(DAY_OF_YEAR); + int minimalDays = getMinimalDaysInFirstWeek(); + + // Quickly check the possibility of year adjustments before + // cloning this GregorianCalendar. + if (dayOfYear > minimalDays && dayOfYear < (maxDayOfYear - 6)) { + return year; + } + + // Create a clone to work on the calculation + GregorianCalendar cal = (GregorianCalendar) clone(); + cal.setLenient(true); + // Use GMT so that intermediate date calculations won't + // affect the time of day fields. + cal.setTimeZone(TimeZone.getTimeZone("GMT")); + // Go to the first day of the year, which is usually January 1. + cal.set(DAY_OF_YEAR, 1); + cal.complete(); + + // Get the first day of the first day-of-week in the year. + int delta = getFirstDayOfWeek() - cal.get(DAY_OF_WEEK); + if (delta != 0) { + if (delta < 0) { + delta += 7; + } + cal.add(DAY_OF_YEAR, delta); + } + int minDayOfYear = cal.get(DAY_OF_YEAR); + if (dayOfYear < minDayOfYear) { + if (minDayOfYear <= minimalDays) { --year; } } else { - if (weekOfYear == 1) { - ++year; + cal.set(YEAR, year + 1); + cal.set(DAY_OF_YEAR, 1); + cal.complete(); + int del = getFirstDayOfWeek() - cal.get(DAY_OF_WEEK); + if (del != 0) { + if (del < 0) { + del += 7; + } + cal.add(DAY_OF_YEAR, del); + } + minDayOfYear = cal.get(DAY_OF_YEAR) - 1; + if (minDayOfYear == 0) { + minDayOfYear = 7; + } + if (minDayOfYear >= minimalDays) { + int days = maxDayOfYear - dayOfYear + 1; + if (days <= (7 - minDayOfYear)) { + ++year; + } } } return year; } - */ + /** + * Sets this {@code GregorianCalendar} to the date given by the + * date specifiers - {@code weekYear}, + * {@code weekOfYear}, and {@code dayOfWeek}. {@code weekOfYear} + * follows the {@code WEEK_OF_YEAR} + * numbering. The {@code dayOfWeek} value must be one of the + * {@link Calendar#DAY_OF_WEEK DAY_OF_WEEK} values: {@link + * Calendar#SUNDAY SUNDAY} to {@link Calendar#SATURDAY SATURDAY}. + * + *

    Note that the numeric day-of-week representation differs from + * the ISO 8601 standard, and that the {@code weekOfYear} + * numbering is compatible with the standard when {@code + * getFirstDayOfWeek()} is {@code MONDAY} and {@code + * getMinimalDaysInFirstWeek()} is 4. + * + *

    Unlike the {@code set} method, all of the calendar fields + * and the instant of time value are calculated upon return. + * + *

    If {@code weekOfYear} is out of the valid week-of-year + * range in {@code weekYear}, the {@code weekYear} + * and {@code weekOfYear} values are adjusted in lenient + * mode, or an {@code IllegalArgumentException} is thrown in + * non-lenient mode. + * + * @param weekYear the week year + * @param weekOfYear the week number based on {@code weekYear} + * @param dayOfWeek the day of week value: one of the constants + * for the {@link #DAY_OF_WEEK DAY_OF_WEEK} field: + * {@link Calendar#SUNDAY SUNDAY}, ..., + * {@link Calendar#SATURDAY SATURDAY}. + * @exception IllegalArgumentException + * if any of the given date specifiers is invalid, + * or if any of the calendar fields are inconsistent + * with the given date specifiers in non-lenient mode + * @see GregorianCalendar#isWeekDateSupported() + * @see Calendar#getFirstDayOfWeek() + * @see Calendar#getMinimalDaysInFirstWeek() + * @since 1.7 + */ + @Override + public void setWeekDate(int weekYear, int weekOfYear, int dayOfWeek) { + if (dayOfWeek < SUNDAY || dayOfWeek > SATURDAY) { + throw new IllegalArgumentException("invalid dayOfWeek: " + dayOfWeek); + } + + // To avoid changing the time of day fields by date + // calculations, use a clone with the GMT time zone. + GregorianCalendar gc = (GregorianCalendar) clone(); + gc.setLenient(true); + int era = gc.get(ERA); + gc.clear(); + gc.setTimeZone(TimeZone.getTimeZone("GMT")); + gc.set(ERA, era); + gc.set(YEAR, weekYear); + gc.set(WEEK_OF_YEAR, 1); + gc.set(DAY_OF_WEEK, getFirstDayOfWeek()); + int days = dayOfWeek - getFirstDayOfWeek(); + if (days < 0) { + days += 7; + } + days += 7 * (weekOfYear - 1); + if (days != 0) { + gc.add(DAY_OF_YEAR, days); + } else { + gc.complete(); + } + + set(ERA, gc.internalGet(ERA)); + set(YEAR, gc.internalGet(YEAR)); + set(MONTH, gc.internalGet(MONTH)); + set(DAY_OF_MONTH, gc.internalGet(DAY_OF_MONTH)); + + // to avoid throwing an IllegalArgumentException in + // non-lenient, set WEEK_OF_YEAR and DAY_OF_WEEK internally + internalSet(WEEK_OF_YEAR, weekOfYear); + internalSet(DAY_OF_WEEK, dayOfWeek); + complete(); + + assert getWeekYear() == weekYear; + assert get(WEEK_OF_YEAR) == weekOfYear; + assert get(DAY_OF_WEEK) == dayOfWeek; + } + + /** + * Returns the number of weeks in the week year + * represented by this {@code GregorianCalendar}. + * + *

    For example, if this {@code GregorianCalendar}'s date is + * December 31, 2008 with the ISO + * 8601 compatible setting, this method will return 53 for the + * period: December 29, 2008 to January 3, 2010 while {@link + * #getActualMaximum(int) getActualMaximum(WEEK_OF_YEAR)} will return + * 52 for the period: December 31, 2007 to December 28, 2008. + * + * @return the number of weeks in the week year. + * @see Calendar#WEEK_OF_YEAR + * @see #getWeekYear() + * @see #getActualMaximum(int) + * @since 1.7 + */ + public int getWeeksInWeekYear() { + GregorianCalendar gc = getNormalizedCalendar(); + int weekYear = gc.getWeekYear(); + if (weekYear == gc.internalGet(YEAR)) { + return gc.getActualMaximum(WEEK_OF_YEAR); + } + + // Use the 2nd week for calculating the max of WEEK_OF_YEAR + if (gc == this) { + gc = (GregorianCalendar) gc.clone(); + } + gc.setWeekDate(weekYear, 2, internalGet(DAY_OF_WEEK)); + return gc.getActualMaximum(WEEK_OF_YEAR); + } ///////////////////////////// // Time => Fields computation @@ -2178,7 +2411,7 @@ public class GregorianCalendar extends Calendar { // If we are in the cutover year, we need some special handling. if (normalizedYear == cutoverYear) { // Need to take care of the "missing" days. - if (getCutoverCalendarSystem() == jcal) { + if (gregorianCutoverYearJulian <= gregorianCutoverYear) { // We need to find out where we are. The cutover // gap could even be more than one year. (One // year difference in ~48667 years.) @@ -2208,27 +2441,36 @@ public class GregorianCalendar extends Calendar { // December 31, which is not always true in // GregorianCalendar. long fixedDec31 = fixedDateJan1 - 1; - long prevJan1; + long prevJan1 = fixedDateJan1 - 365; if (normalizedYear > (cutoverYear + 1)) { - prevJan1 = fixedDateJan1 - 365; if (CalendarUtils.isGregorianLeapYear(normalizedYear - 1)) { --prevJan1; } + } else if (normalizedYear <= gregorianCutoverYearJulian) { + if (CalendarUtils.isJulianLeapYear(normalizedYear - 1)) { + --prevJan1; + } } else { BaseCalendar calForJan1 = calsys; - int prevYear = normalizedYear - 1; - if (prevYear == cutoverYear) { + //int prevYear = normalizedYear - 1; + int prevYear = getCalendarDate(fixedDec31).getNormalizedYear(); + if (prevYear == gregorianCutoverYear) { calForJan1 = getCutoverCalendarSystem(); - } - prevJan1 = calForJan1.getFixedDate(prevYear, - BaseCalendar.JANUARY, - 1, - null); - while (prevJan1 > fixedDec31) { - prevJan1 = getJulianCalendarSystem().getFixedDate(--prevYear, - BaseCalendar.JANUARY, - 1, - null); + if (calForJan1 == jcal) { + prevJan1 = calForJan1.getFixedDate(prevYear, + BaseCalendar.JANUARY, + 1, + null); + } else { + prevJan1 = gregorianCutoverDate; + calForJan1 = gcal; + } + } else if (prevYear <= gregorianCutoverYearJulian) { + calForJan1 = getJulianCalendarSystem(); + prevJan1 = calForJan1.getFixedDate(prevYear, + BaseCalendar.JANUARY, + 1, + null); } } weekOfYear = getWeekNumber(prevJan1, fixedDec31); @@ -2260,14 +2502,20 @@ public class GregorianCalendar extends Calendar { if (nextYear == gregorianCutoverYear) { calForJan1 = getCutoverCalendarSystem(); } - long nextJan1 = calForJan1.getFixedDate(nextYear, - BaseCalendar.JANUARY, - 1, - null); - if (nextJan1 < fixedDate) { + + long nextJan1; + if (nextYear > gregorianCutoverYear + || gregorianCutoverYearJulian == gregorianCutoverYear + || nextYear == gregorianCutoverYearJulian) { + nextJan1 = calForJan1.getFixedDate(nextYear, + BaseCalendar.JANUARY, + 1, + null); + } else { nextJan1 = gregorianCutoverDate; calForJan1 = gcal; } + long nextJan1st = calForJan1.getDayOfWeekDateOnOrBefore(nextJan1 + 6, getFirstDayOfWeek()); int ndays = (int)(nextJan1st - nextJan1); @@ -2409,10 +2657,24 @@ public class GregorianCalendar extends Calendar { } gfd = jfd; } else { - gfd = fixedDate + getFixedDate(gcal, year, fieldMask); jfd = fixedDate + getFixedDate(getJulianCalendarSystem(), year, fieldMask); + gfd = fixedDate + getFixedDate(gcal, year, fieldMask); } + // Now we have to determine which calendar date it is. + + // If the date is relative from the beginning of the year + // in the Julian calendar, then use jfd; + if (isFieldSet(fieldMask, DAY_OF_YEAR) || isFieldSet(fieldMask, WEEK_OF_YEAR)) { + if (gregorianCutoverYear == gregorianCutoverYearJulian) { + fixedDate = jfd; + break calculateFixedDate; + } else if (year == gregorianCutoverYear) { + fixedDate = gfd; + break calculateFixedDate; + } + } + if (gfd >= gregorianCutoverDate) { if (jfd >= gregorianCutoverDate) { fixedDate = gfd; @@ -2494,9 +2756,10 @@ public class GregorianCalendar extends Calendar { continue; } if (originalFields[field] != internalGet(field)) { + String s = originalFields[field] + " -> " + internalGet(field); // Restore the original field values System.arraycopy(originalFields, 0, fields, 0, fields.length); - throw new IllegalArgumentException(getFieldName(field)); + throw new IllegalArgumentException(getFieldName(field) + ": " + s); } } } @@ -2669,9 +2932,7 @@ public class GregorianCalendar extends Calendar { * method returns Gregorian. Otherwise, Julian. */ private BaseCalendar getCutoverCalendarSystem() { - CalendarDate date = getGregorianCutoverDate(); - if (date.getMonth() == BaseCalendar.JANUARY - && date.getDayOfMonth() == 1) { + if (gregorianCutoverYearJulian < gregorianCutoverYear) { return gcal; } return getJulianCalendarSystem(); diff --git a/jdk/test/java/text/Format/DateFormat/WeekDateTest.java b/jdk/test/java/text/Format/DateFormat/WeekDateTest.java new file mode 100644 index 00000000000..d7908d913e4 --- /dev/null +++ b/jdk/test/java/text/Format/DateFormat/WeekDateTest.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 4267450 + * @summary Unit test for week date support + */ + +import java.text.*; +import java.util.*; +import static java.util.GregorianCalendar.*; + +public class WeekDateTest { + static SimpleDateFormat ymdFormat = new SimpleDateFormat("yyyy-MM-dd"); + static SimpleDateFormat ywdFormat = new SimpleDateFormat("YYYY-'W'ww-u"); + static { + ymdFormat.setCalendar(newCalendar()); + ywdFormat.setCalendar(newCalendar()); + } + + // Round-trip Data + static final String[][] roundTripData = { + { "2005-01-01", "2004-W53-6" }, + { "2005-01-02", "2004-W53-7" }, + { "2005-12-31", "2005-W52-6" }, + { "2007-01-01", "2007-W01-1" }, + { "2007-12-30", "2007-W52-7" }, + { "2007-12-31", "2008-W01-1" }, + { "2008-01-01", "2008-W01-2" }, + { "2008-12-29", "2009-W01-1" }, + { "2008-12-31", "2009-W01-3" }, + { "2009-01-01", "2009-W01-4" }, + { "2009-12-31", "2009-W53-4" }, + { "2010-01-03", "2009-W53-7" }, + { "2009-12-31", "2009-W53-4" }, + { "2010-01-01", "2009-W53-5" }, + { "2010-01-02", "2009-W53-6" }, + { "2010-01-03", "2009-W53-7" }, + { "2008-12-28", "2008-W52-7" }, + { "2008-12-29", "2009-W01-1" }, + { "2008-12-30", "2009-W01-2" }, + { "2008-12-31", "2009-W01-3" }, + { "2009-01-01", "2009-W01-4" }, + { "2009-01-01", "2009-W01-4" }, + }; + + // Data for leniency test + static final String[][] leniencyData = { + { "2008-12-28", "2009-W01-0" }, + { "2010-01-04", "2009-W53-8" }, + { "2008-12-29", "2008-W53-1" }, + }; + + static final String[] invalidData = { + "2010-W00-1", + "2010-W55-1", + "2010-W03-0", + "2010-W04-8", + "2010-W04-19" + }; + + public static void main(String[] args) throws Exception { + formatTest(roundTripData); + parseTest(roundTripData); + parseTest(leniencyData); + nonLenientTest(invalidData); + noWeekDateSupport(); + } + + private static void formatTest(String[][] data) throws Exception { + for (String[] dates : data) { + String regularDate = dates[0]; + String weekDate = dates[1]; + Date date = null; + date = ymdFormat.parse(regularDate); + String s = ywdFormat.format(date); + if (!s.equals(weekDate)) { + throw new RuntimeException("format: got="+s+", expecetd="+weekDate); + } + } + } + + private static void parseTest(String[][] data) throws Exception { + for (String[] dates : data) { + String regularDate = dates[0]; + String weekDate = dates[1]; + Date date1 = null, date2 = null; + date1 = ymdFormat.parse(regularDate); + date2 = ywdFormat.parse(weekDate); + if (!date1.equals(date2)) { + System.err.println(regularDate + ": date1 = " + date1); + System.err.println(weekDate + ": date2 = " + date2); + throw new RuntimeException("parse: date1 != date2"); + } + } + } + + + // Non-lenient mode test + private static void nonLenientTest(String[] data) { + ywdFormat.setLenient(false); + for (String date : data) { + try { + Date d = ywdFormat.parse(date); + throw new RuntimeException("No ParseException thrown with " + date); + } catch (ParseException e) { + // OK + } + } + ywdFormat.setLenient(true); + } + + + private static void noWeekDateSupport() throws Exception { + // Tests with Japanese Imperial Calendar that doesn't support week dates. + Calendar jcal = Calendar.getInstance(TimeZone.getTimeZone("GMT"), + new Locale("ja", "JP", "JP")); + + jcal.setFirstDayOfWeek(MONDAY); + jcal.setMinimalDaysInFirstWeek(4); + SimpleDateFormat sdf = new SimpleDateFormat("Y-'W'ww-u"); + sdf.setCalendar(jcal); + Date d = sdf.parse("21-W01-3"); // 2008-12-31 == H20-12-31 + GregorianCalendar gcal = newCalendar(); + gcal.setTime(d); + if (gcal.get(YEAR) != 2008 + || gcal.get(MONTH) != DECEMBER + || gcal.get(DAY_OF_MONTH) != 31) { + String s = String.format("noWeekDateSupport: got %04d-%02d-%02d, expected 2008-12-31%n", + gcal.get(YEAR), + gcal.get(MONTH)+1, + gcal.get(DAY_OF_MONTH)); + throw new RuntimeException(s); + } + } + + private static GregorianCalendar newCalendar() { + // Use GMT to avoid any surprises related DST transitions. + GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); + // Setup the ISO 8601 compatible parameters + cal.setFirstDayOfWeek(MONDAY); + cal.setMinimalDaysInFirstWeek(4); + return cal; + } +} diff --git a/jdk/test/java/util/Calendar/WeekDateTest.java b/jdk/test/java/util/Calendar/WeekDateTest.java new file mode 100644 index 00000000000..277f8ede900 --- /dev/null +++ b/jdk/test/java/util/Calendar/WeekDateTest.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 4267450 + * @summary Unit test for week date support + */ + +import java.text.*; +import java.util.*; +import static java.util.GregorianCalendar.*; + +public class WeekDateTest { + + // Week dates are in the ISO numbering for day-of-week. + static int[][][] data = { + // Calendar year-date, Week year-date + {{ 2005, 01, 01}, {2004, 53, 6}}, + {{ 2005, 01, 02}, {2004, 53, 7}}, + {{ 2005, 12, 31}, {2005, 52, 6}}, + {{ 2007, 01, 01}, {2007, 01, 1}}, + {{ 2007, 12, 30}, {2007, 52, 7}}, + {{ 2007, 12, 31}, {2008, 01, 1}}, + {{ 2008, 01, 01}, {2008, 01, 2}}, + {{ 2008, 12, 29}, {2009, 01, 1}}, + {{ 2008, 12, 31}, {2009, 01, 3}}, + {{ 2009, 01, 01}, {2009, 01, 4}}, + {{ 2009, 12, 31}, {2009, 53, 4}}, + {{ 2010, 01, 03}, {2009, 53, 7}}, + {{ 2009, 12, 31}, {2009, 53, 4}}, + {{ 2010, 01, 01}, {2009, 53, 5}}, + {{ 2010, 01, 02}, {2009, 53, 6}}, + {{ 2010, 01, 03}, {2009, 53, 7}}, + {{ 2008, 12, 28}, {2008, 52, 7}}, + {{ 2008, 12, 29}, {2009, 01, 1}}, + {{ 2008, 12, 30}, {2009, 01, 2}}, + {{ 2008, 12, 31}, {2009, 01, 3}}, + {{ 2009, 01, 01}, {2009, 01, 4}} + }; + + public static void main(String[] args) { + GregorianCalendar cal = newCalendar(); + for (int[][] dates : data) { + int[] expected = dates[0]; + int[] weekDate = dates[1]; + // Convert ISO 8601 day-of-week to Calendar.DAY_OF_WEEK. + int dayOfWeek = weekDate[2] == 7 ? SUNDAY : weekDate[2] + 1; + + cal.clear(); + cal.setWeekDate(weekDate[0], weekDate[1], dayOfWeek); + if (cal.get(YEAR) != expected[0] + || cal.get(MONTH)+1 != expected[1] + || cal.get(DAY_OF_MONTH) != expected[2]) { + String s = String.format("got=%4d-%02d-%02d, expected=%4d-%02d-%02d", + cal.get(YEAR), cal.get(MONTH)+1, cal.get(DAY_OF_MONTH), + expected[0], expected[1], expected[2]); + throw new RuntimeException(s); + } + if (cal.getWeekYear() != weekDate[0] + || cal.get(WEEK_OF_YEAR) != weekDate[1] + || cal.get(DAY_OF_WEEK) != dayOfWeek) { + String s = String.format( + "got=%4d-W%02d-%d, expected=%4d-W%02d-%d (not ISO day-of-week)", + cal.getWeekYear(), cal.get(WEEK_OF_YEAR), cal.get(DAY_OF_WEEK), + weekDate[0], weekDate[1], dayOfWeek); + throw new RuntimeException(s); + } + } + + // Test getWeeksInWeekYear(). + // If we avoid the first week of January and the last week of + // December, getWeeksInWeekYear() and + // getActualMaximum(WEEK_OF_YEAR) values should be the same. + for (int year = 2000; year <= 2100; year++) { + cal.clear(); + cal.set(year, JUNE, 1); + int n = cal.getWeeksInWeekYear(); + if (n != cal.getActualMaximum(WEEK_OF_YEAR)) { + String s = String.format("getWeeksInWeekYear() = %d, " + + "getActualMaximum(WEEK_OF_YEAR) = %d%n", + n, cal.getActualMaximum(WEEK_OF_YEAR)); + throw new RuntimeException(s); + } + cal.setWeekDate(cal.getWeekYear(), 1, MONDAY); + System.out.println(cal.getTime()); + if (cal.getWeeksInWeekYear() != n) { + String s = String.format("first day: got %d, expected %d%n", + cal.getWeeksInWeekYear(), n); + throw new RuntimeException(s); + } + cal.setWeekDate(cal.getWeekYear(), n, SUNDAY); + System.out.println(cal.getTime()); + if (cal.getWeeksInWeekYear() != n) { + String s = String.format("last day: got %d, expected %d%n", + cal.getWeeksInWeekYear(), n); + throw new RuntimeException(s); + } + } + } + + private static GregorianCalendar newCalendar() { + // Use GMT to avoid any surprises related DST transitions. + GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); + if (!cal.isWeekDateSupported()) { + throw new RuntimeException("Week dates not supported"); + } + // Setup the ISO 8601 compatible parameters + cal.setFirstDayOfWeek(MONDAY); + cal.setMinimalDaysInFirstWeek(4); + return cal; + } +} From 63495e2114c3eeabb99f3bca2101e7c1102a1d0a Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Tue, 31 Aug 2010 23:56:17 -0700 Subject: [PATCH 025/128] 6981466: Adding missing test LocaleCategory.java Reviewed-by: okutsu --- jdk/test/java/util/Locale/LocaleCategory.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 jdk/test/java/util/Locale/LocaleCategory.java diff --git a/jdk/test/java/util/Locale/LocaleCategory.java b/jdk/test/java/util/Locale/LocaleCategory.java new file mode 100644 index 00000000000..2b6c110e21e --- /dev/null +++ b/jdk/test/java/util/Locale/LocaleCategory.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +import java.util.Locale; + +public class LocaleCategory { + private static Locale base = null; + private static Locale disp = null; + private static Locale fmt = null; + private static String enc = null; + + public static void main(String[] args) { + base = new Locale(System.getProperty("user.language", ""), + System.getProperty("user.country", ""), + System.getProperty("user.variant", "")); + disp = new Locale(System.getProperty("user.language.display", ""), + System.getProperty("user.country.display", ""), + System.getProperty("user.variant.display", "")); + fmt = new Locale(System.getProperty("user.language.format", ""), + System.getProperty("user.country.format", ""), + System.getProperty("user.variant.format", "")); + checkDefault(); + testGetSetDefault(); + } + + static void checkDefault() { + if (!base.equals(Locale.getDefault()) || + !disp.equals(Locale.getDefault(Locale.Category.DISPLAY)) || + !fmt.equals(Locale.getDefault(Locale.Category.FORMAT))) { + throw new RuntimeException("Some of the return values from getDefault() do not agree with the locale derived from \"user.xxxx\" system properties"); + } + } + + static void testGetSetDefault() { + try { + Locale.setDefault(null, null); + throw new RuntimeException("setDefault(null, null) should throw a NullPointerException"); + } catch (NullPointerException npe) {} + + Locale.setDefault(Locale.CHINA); + if (!Locale.CHINA.equals(Locale.getDefault(Locale.Category.DISPLAY)) || + !Locale.CHINA.equals(Locale.getDefault(Locale.Category.FORMAT))) { + throw new RuntimeException("setDefault() should set all default locales for all categories"); + } + } +} + From ca3dbff3f853f45fd98a2b27c333447b96409326 Mon Sep 17 00:00:00 2001 From: John R Rose Date: Wed, 1 Sep 2010 03:19:16 -0700 Subject: [PATCH 026/128] 6979683: inconsistent interaction of reference cast with box/unbox conversions leaves out a useful case Allow casts which narrow and then unbox. Reviewed-by: mcimadamore --- .../com/sun/tools/javac/code/Types.java | 2 +- .../com/sun/tools/javac/comp/Lower.java | 13 +- .../javac/6979683/TestCast6979683_BAD34.java | 40 +++++++ .../6979683/TestCast6979683_BAD34.java.errlog | 2 + .../javac/6979683/TestCast6979683_BAD35.java | 40 +++++++ .../6979683/TestCast6979683_BAD35.java.errlog | 2 + .../javac/6979683/TestCast6979683_BAD36.java | 40 +++++++ .../6979683/TestCast6979683_BAD36.java.errlog | 2 + .../javac/6979683/TestCast6979683_BAD37.java | 40 +++++++ .../6979683/TestCast6979683_BAD37.java.errlog | 2 + .../javac/6979683/TestCast6979683_BAD38.java | 40 +++++++ .../6979683/TestCast6979683_BAD38.java.errlog | 2 + .../javac/6979683/TestCast6979683_BAD39.java | 40 +++++++ .../6979683/TestCast6979683_BAD39.java.errlog | 2 + .../javac/6979683/TestCast6979683_GOOD.java | 111 ++++++++++++++++++ 15 files changed, 375 insertions(+), 3 deletions(-) create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD34.java create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD34.java.errlog create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD35.java create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD35.java.errlog create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD36.java create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD36.java.errlog create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD37.java create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD37.java.errlog create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD38.java create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD38.java.errlog create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD39.java create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_BAD39.java.errlog create mode 100644 langtools/test/tools/javac/6979683/TestCast6979683_GOOD.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java index 57b49b821c2..4ab94d76749 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java @@ -915,7 +915,7 @@ public class Types { return true; if (t.isPrimitive() != s.isPrimitive()) - return allowBoxing && isConvertible(t, s, warn); + return allowBoxing && (isConvertible(t, s, warn) || isConvertible(s, t, warn)); if (warn != warnStack.head) { try { diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java index 813b3500d2c..c7ffb485946 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java @@ -2889,8 +2889,17 @@ public class Lower extends TreeTranslator { /** Unbox an object to a primitive value. */ JCExpression unbox(JCExpression tree, Type primitive) { Type unboxedType = types.unboxedType(tree.type); - // note: the "primitive" parameter is not used. There muse be - // a conversion from unboxedType to primitive. + if (unboxedType.tag == NONE) { + unboxedType = primitive; + if (!unboxedType.isPrimitive()) + throw new AssertionError(unboxedType); + make_at(tree.pos()); + tree = make.TypeCast(types.boxedClass(unboxedType).type, tree); + } else { + // There must be a conversion from unboxedType to primitive. + if (!types.isSubtype(unboxedType, primitive)) + throw new AssertionError(tree); + } make_at(tree.pos()); Symbol valueSym = lookupMethod(tree.pos(), unboxedType.tsym.name.append(names.Value), // x.intValue() diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD34.java b/langtools/test/tools/javac/6979683/TestCast6979683_BAD34.java new file mode 100644 index 00000000000..d58b2ce9697 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD34.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6979683 + * @summary Verify that casts can narrow and unbox at the same time + * @author jrose + * + * @compile/fail/ref=TestCast6979683_BAD34.java.errlog -XDrawDiagnostics TestCast6979683_BAD34.java + */ + +public class TestCast6979683_BAD34 { + static boolean zconvBAD1(Number o) { return o; } //BAD + //... + //... + //... + //... + //... +} diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD34.java.errlog b/langtools/test/tools/javac/6979683/TestCast6979683_BAD34.java.errlog new file mode 100644 index 00000000000..d43be7b22b5 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD34.java.errlog @@ -0,0 +1,2 @@ +TestCast6979683_BAD34.java:34:49: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.Number, boolean +1 error diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD35.java b/langtools/test/tools/javac/6979683/TestCast6979683_BAD35.java new file mode 100644 index 00000000000..d738f273e96 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD35.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6979683 + * @summary Verify that casts can narrow and unbox at the same time + * @author jrose + * + * @compile/fail/ref=TestCast6979683_BAD35.java.errlog -XDrawDiagnostics TestCast6979683_BAD35.java + */ + +public class TestCast6979683_BAD35 { + //... + static int iconvBAD1(Number o) { return o; } //BAD: cast needed + //... + //... + //... + //... +} diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD35.java.errlog b/langtools/test/tools/javac/6979683/TestCast6979683_BAD35.java.errlog new file mode 100644 index 00000000000..270f5b79bd5 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD35.java.errlog @@ -0,0 +1,2 @@ +TestCast6979683_BAD35.java:35:45: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.Number, int +1 error diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD36.java b/langtools/test/tools/javac/6979683/TestCast6979683_BAD36.java new file mode 100644 index 00000000000..a86137367a7 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD36.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6979683 + * @summary Verify that casts can narrow and unbox at the same time + * @author jrose + * + * @compile/fail/ref=TestCast6979683_BAD36.java.errlog -XDrawDiagnostics TestCast6979683_BAD36.java + */ + +public class TestCast6979683_BAD36 { + //... + //... + static int iconvBAD2(Comparable o) { return o; } //BAD: cast needed + //... + //... + //... +} diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD36.java.errlog b/langtools/test/tools/javac/6979683/TestCast6979683_BAD36.java.errlog new file mode 100644 index 00000000000..f4338d82550 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD36.java.errlog @@ -0,0 +1,2 @@ +TestCast6979683_BAD36.java:36:58: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.Comparable, int +1 error diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD37.java b/langtools/test/tools/javac/6979683/TestCast6979683_BAD37.java new file mode 100644 index 00000000000..f972b5337f8 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD37.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6979683 + * @summary Verify that casts can narrow and unbox at the same time + * @author jrose + * + * @compile/fail/ref=TestCast6979683_BAD37.java.errlog -XDrawDiagnostics TestCast6979683_BAD37.java + */ + +public class TestCast6979683_BAD37 { + //... + //... + //... + static int iconvBAD3(Comparable o) { return (int)o; } //BAD: wrong instance + //... + //... +} diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD37.java.errlog b/langtools/test/tools/javac/6979683/TestCast6979683_BAD37.java.errlog new file mode 100644 index 00000000000..89b7a57418d --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD37.java.errlog @@ -0,0 +1,2 @@ +TestCast6979683_BAD37.java:37:61: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), java.lang.Comparable, int +1 error diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD38.java b/langtools/test/tools/javac/6979683/TestCast6979683_BAD38.java new file mode 100644 index 00000000000..043fa452619 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD38.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6979683 + * @summary Verify that casts can narrow and unbox at the same time + * @author jrose + * + * @compile/fail/ref=TestCast6979683_BAD38.java.errlog -XDrawDiagnostics TestCast6979683_BAD38.java + */ + +public class TestCast6979683_BAD38 { + //... + //... + //... + //... + static float cconvBAD1(Comparable o) { return o; } //BAD + //... +} diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD38.java.errlog b/langtools/test/tools/javac/6979683/TestCast6979683_BAD38.java.errlog new file mode 100644 index 00000000000..47d617aec10 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD38.java.errlog @@ -0,0 +1,2 @@ +TestCast6979683_BAD38.java:38:62: compiler.err.prob.found.req: (compiler.misc.incompatible.types), java.lang.Comparable, float +1 error diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD39.java b/langtools/test/tools/javac/6979683/TestCast6979683_BAD39.java new file mode 100644 index 00000000000..ab11d0d78ff --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD39.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6979683 + * @summary Verify that casts can narrow and unbox at the same time + * @author jrose + * + * @compile/fail/ref=TestCast6979683_BAD39.java.errlog -XDrawDiagnostics TestCast6979683_BAD39.java + */ + +public class TestCast6979683_BAD39 { + //... + //... + //... + //... + //... + static float cconvBAD2(Number o) { return (char)o; } //BAD +} diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_BAD39.java.errlog b/langtools/test/tools/javac/6979683/TestCast6979683_BAD39.java.errlog new file mode 100644 index 00000000000..9f41dfa56d1 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_BAD39.java.errlog @@ -0,0 +1,2 @@ +TestCast6979683_BAD39.java:39:53: compiler.err.prob.found.req: (compiler.misc.inconvertible.types), java.lang.Number, char +1 error diff --git a/langtools/test/tools/javac/6979683/TestCast6979683_GOOD.java b/langtools/test/tools/javac/6979683/TestCast6979683_GOOD.java new file mode 100644 index 00000000000..594d0f42440 --- /dev/null +++ b/langtools/test/tools/javac/6979683/TestCast6979683_GOOD.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6979683 + * @summary Verify that casts can narrow and unbox at the same time + * @author jrose + * + * @compile TestCast6979683_GOOD.java + * @run main TestCast6979683_GOOD + */ + +public class TestCast6979683_GOOD { + public static void main(String... av) { + bugReportExample(); + for (int x = -1; x <= 2; x++) { + zconvTests(x != 0); + iconvTests(x); + bconvTests((byte)x); + cconvTests((char)x); + } + System.out.println("Successfully ran "+tests+" tests."); + } + + static int tests; + static void assertEquals(Object x, Object y) { + if (!x.equals(y)) { + throw new RuntimeException("assertEquals: "+x+" != "+y); + } + ++tests; + } + + static void bugReportExample() { + {} // example in bug report: + Object x = (Object)1; + int y = (int)x; + {} // end example + } + + static boolean zconv1(Boolean o) { return o; } + static boolean zconv2(Object o) { return (boolean)o; } + static boolean zconv3(Comparable o) { return (boolean)o; } + + static void zconvTests(boolean x) { + assertEquals(x, zconv1(x)); + assertEquals(x, zconv2(x)); + assertEquals(x, zconv3(x)); + } + + static int iconv1(Integer o) { return o; } + static int iconv2(Object o) { return (int)o; } + static int iconv3(java.io.Serializable o) { return (int)o; } + static int iconv4(Number o) { return (int)o; } + static int iconv5(Comparable o) { return (int)o; } + + static void iconvTests(int x) { + assertEquals(x, iconv1(x)); + assertEquals(x, iconv2(x)); + assertEquals(x, iconv3(x)); + assertEquals(x, iconv4(x)); + assertEquals(x, iconv5(x)); + } + + static float bconv1(Byte o) { return o; } // note type "float" + static float bconv2(Object o) { return (byte)o; } + static float bconv3(java.io.Serializable o) { return (byte)o; } + static float bconv4(Number o) { return (byte)o; } + + static void bconvTests(byte x) { + float xf = x; + assertEquals(xf, bconv1(x)); + assertEquals(xf, bconv2(x)); + assertEquals(xf, bconv3(x)); + assertEquals(xf, bconv4(x)); + } + + static float cconv1(Character o) { return o; } // note type "float" + static float cconv2(Object o) { return (char)o; } + static float cconv3(java.io.Serializable o) { return (char)o; } + static float cconv4(Comparable o) { return (char)o; } + + static void cconvTests(char x) { + float xf = x; + assertEquals(xf, cconv1(x)); + assertEquals(xf, cconv2(x)); + assertEquals(xf, cconv3(x)); + assertEquals(xf, cconv4(x)); + } + +} From 080f83060e5c21cc480dff7cd2d4ee0dcc4155c6 Mon Sep 17 00:00:00 2001 From: Martin Buchholz Date: Wed, 1 Sep 2010 09:45:08 -0700 Subject: [PATCH 027/128] 6981145: (se) Eliminate JNI*Critical when creating pipes and other cleanups Avoid *Critical; fix compile warnings; improve readability Reviewed-by: alanb --- jdk/make/java/nio/mapfile-linux | 2 +- jdk/make/java/nio/mapfile-solaris | 2 +- jdk/src/share/classes/sun/nio/ch/IOUtil.java | 7 ++- .../sun/nio/ch/DevPollSelectorImpl.java | 9 ++- .../classes/sun/nio/ch/EPollSelectorImpl.java | 9 ++- .../solaris/classes/sun/nio/ch/PipeImpl.java | 9 +-- .../classes/sun/nio/ch/PollSelectorImpl.java | 7 +-- jdk/src/solaris/native/sun/nio/ch/IOUtil.c | 63 +++++++++---------- 8 files changed, 54 insertions(+), 54 deletions(-) diff --git a/jdk/make/java/nio/mapfile-linux b/jdk/make/java/nio/mapfile-linux index 13cc1cd01ec..c3645c5ed05 100644 --- a/jdk/make/java/nio/mapfile-linux +++ b/jdk/make/java/nio/mapfile-linux @@ -89,7 +89,7 @@ SUNWprivate_1.1 { Java_sun_nio_ch_IOUtil_drain; Java_sun_nio_ch_IOUtil_fdVal; Java_sun_nio_ch_IOUtil_initIDs; - Java_sun_nio_ch_IOUtil_initPipe; + Java_sun_nio_ch_IOUtil_makePipe; Java_sun_nio_ch_IOUtil_randomBytes; Java_sun_nio_ch_IOUtil_setfdVal; Java_sun_nio_ch_NativeThread_current; diff --git a/jdk/make/java/nio/mapfile-solaris b/jdk/make/java/nio/mapfile-solaris index 2b80e4e801e..e0dff0a32f3 100644 --- a/jdk/make/java/nio/mapfile-solaris +++ b/jdk/make/java/nio/mapfile-solaris @@ -76,7 +76,7 @@ SUNWprivate_1.1 { Java_sun_nio_ch_IOUtil_drain; Java_sun_nio_ch_IOUtil_fdVal; Java_sun_nio_ch_IOUtil_initIDs; - Java_sun_nio_ch_IOUtil_initPipe; + Java_sun_nio_ch_IOUtil_makePipe; Java_sun_nio_ch_IOUtil_randomBytes; Java_sun_nio_ch_IOUtil_setfdVal; Java_sun_nio_ch_NativeThread_current; diff --git a/jdk/src/share/classes/sun/nio/ch/IOUtil.java b/jdk/src/share/classes/sun/nio/ch/IOUtil.java index 86acff63566..97c8dca92b0 100644 --- a/jdk/src/share/classes/sun/nio/ch/IOUtil.java +++ b/jdk/src/share/classes/sun/nio/ch/IOUtil.java @@ -319,7 +319,12 @@ class IOUtil { static native boolean randomBytes(byte[] someBytes); - static native void initPipe(int[] fda, boolean blocking); + /** + * Returns two file descriptors for a pipe encoded in a long. + * The read end of the pipe is returned in the high 32 bits, + * while the write end is returned in the low 32 bits. + */ + static native long makePipe(boolean blocking); static native boolean drain(int fd) throws IOException; diff --git a/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java b/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java index 9cecedd8394..fd2538f90da 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java @@ -65,10 +65,9 @@ class DevPollSelectorImpl */ DevPollSelectorImpl(SelectorProvider sp) { super(sp); - int[] fdes = new int[2]; - IOUtil.initPipe(fdes, false); - fd0 = fdes[0]; - fd1 = fdes[1]; + long pipeFds = IOUtil.makePipe(false); + fd0 = (int) (pipeFds >>> 32); + fd1 = (int) pipeFds; pollWrapper = new DevPollArrayWrapper(); pollWrapper.initInterrupt(fd0, fd1); fdToKey = new HashMap(); @@ -147,7 +146,7 @@ class DevPollSelectorImpl selectedKeys = null; // Deregister channels - Iterator i = keys.iterator(); + Iterator i = keys.iterator(); while (i.hasNext()) { SelectionKeyImpl ski = (SelectionKeyImpl)i.next(); deregister(ski); diff --git a/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java b/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java index f631266955e..7881fe56a31 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java @@ -62,10 +62,9 @@ class EPollSelectorImpl */ EPollSelectorImpl(SelectorProvider sp) { super(sp); - int[] fdes = new int[2]; - IOUtil.initPipe(fdes, false); - fd0 = fdes[0]; - fd1 = fdes[1]; + long pipeFds = IOUtil.makePipe(false); + fd0 = (int) (pipeFds >>> 32); + fd1 = (int) pipeFds; pollWrapper = new EPollArrayWrapper(); pollWrapper.initInterrupt(fd0, fd1); fdToKey = new HashMap(); @@ -144,7 +143,7 @@ class EPollSelectorImpl selectedKeys = null; // Deregister channels - Iterator i = keys.iterator(); + Iterator i = keys.iterator(); while (i.hasNext()) { SelectionKeyImpl ski = (SelectionKeyImpl)i.next(); deregister(ski); diff --git a/jdk/src/solaris/classes/sun/nio/ch/PipeImpl.java b/jdk/src/solaris/classes/sun/nio/ch/PipeImpl.java index 3aece1209dd..0e2852b95a1 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/PipeImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/PipeImpl.java @@ -39,13 +39,14 @@ class PipeImpl private final SinkChannel sink; PipeImpl(SelectorProvider sp) { - int[] fdes = new int[2]; - IOUtil.initPipe(fdes, true); + long pipeFds = IOUtil.makePipe(true); + int readFd = (int) (pipeFds >>> 32); + int writeFd = (int) pipeFds; FileDescriptor sourcefd = new FileDescriptor(); - IOUtil.setfdVal(sourcefd, fdes[0]); + IOUtil.setfdVal(sourcefd, readFd); source = new SourceChannelImpl(sp, sourcefd); FileDescriptor sinkfd = new FileDescriptor(); - IOUtil.setfdVal(sinkfd, fdes[1]); + IOUtil.setfdVal(sinkfd, writeFd); sink = new SinkChannelImpl(sp, sinkfd); } diff --git a/jdk/src/solaris/classes/sun/nio/ch/PollSelectorImpl.java b/jdk/src/solaris/classes/sun/nio/ch/PollSelectorImpl.java index 0709d43c6a0..2a776e16a4d 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/PollSelectorImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/PollSelectorImpl.java @@ -54,10 +54,9 @@ class PollSelectorImpl */ PollSelectorImpl(SelectorProvider sp) { super(sp, 1, 1); - int[] fdes = new int[2]; - IOUtil.initPipe(fdes, false); - fd0 = fdes[0]; - fd1 = fdes[1]; + long pipeFds = IOUtil.makePipe(false); + fd0 = (int) (pipeFds >>> 32); + fd1 = (int) pipeFds; pollWrapper = new PollArrayWrapper(INIT_CAP); pollWrapper.initInterrupt(fd0, fd1); channelArray = new SelectionKeyImpl[INIT_CAP]; diff --git a/jdk/src/solaris/native/sun/nio/ch/IOUtil.c b/jdk/src/solaris/native/sun/nio/ch/IOUtil.c index 2ade52e6d17..455878f5d40 100644 --- a/jdk/src/solaris/native/sun/nio/ch/IOUtil.c +++ b/jdk/src/solaris/native/sun/nio/ch/IOUtil.c @@ -67,12 +67,9 @@ static int configureBlocking(int fd, jboolean blocking) { int flags = fcntl(fd, F_GETFL); + int newflags = blocking ? (flags & ~O_NONBLOCK) : (flags | O_NONBLOCK); - if ((blocking == JNI_FALSE) && !(flags & O_NONBLOCK)) - return fcntl(fd, F_SETFL, flags | O_NONBLOCK); - else if ((blocking == JNI_TRUE) && (flags & O_NONBLOCK)) - return fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); - return 0; + return (flags == newflags) ? 0 : fcntl(fd, F_SETFL, newflags); } JNIEXPORT void JNICALL @@ -83,27 +80,25 @@ Java_sun_nio_ch_IOUtil_configureBlocking(JNIEnv *env, jclass clazz, JNU_ThrowIOExceptionWithLastError(env, "Configure blocking failed"); } -JNIEXPORT void JNICALL -Java_sun_nio_ch_IOUtil_initPipe(JNIEnv *env, jobject this, - jintArray intArray, jboolean block) +JNIEXPORT jlong JNICALL +Java_sun_nio_ch_IOUtil_makePipe(JNIEnv *env, jobject this, jboolean blocking) { int fd[2]; - jint *ptr = 0; if (pipe(fd) < 0) { JNU_ThrowIOExceptionWithLastError(env, "Pipe failed"); - return; + return 0; } - if (block == JNI_FALSE) { + if (blocking == JNI_FALSE) { if ((configureBlocking(fd[0], JNI_FALSE) < 0) || (configureBlocking(fd[1], JNI_FALSE) < 0)) { JNU_ThrowIOExceptionWithLastError(env, "Configure blocking failed"); + close(fd[0]); + close(fd[1]); + return 0; } } - ptr = (*env)->GetPrimitiveArrayCritical(env, intArray, 0); - ptr[0] = fd[0]; - ptr[1] = fd[1]; - (*env)->ReleasePrimitiveArrayCritical(env, intArray, ptr, 0); + return ((jlong) fd[0] << 32) | (jlong) fd[1]; } JNIEXPORT jboolean JNICALL @@ -131,21 +126,22 @@ convertReturnVal(JNIEnv *env, jint n, jboolean reading) { if (n > 0) /* Number of bytes written */ return n; - if (n < 0) { - if (errno == EAGAIN) - return IOS_UNAVAILABLE; - if (errno == EINTR) - return IOS_INTERRUPTED; - } - if (n == 0) { + else if (n == 0) { if (reading) { return IOS_EOF; /* EOF is -1 in javaland */ } else { return 0; } } - JNU_ThrowIOExceptionWithLastError(env, "Read/write failed"); - return IOS_THROWN; + else if (errno == EAGAIN) + return IOS_UNAVAILABLE; + else if (errno == EINTR) + return IOS_INTERRUPTED; + else { + const char *msg = reading ? "Read failed" : "Write failed"; + JNU_ThrowIOExceptionWithLastError(env, msg); + return IOS_THROWN; + } } /* Declared in nio_util.h for use elsewhere in NIO */ @@ -155,21 +151,22 @@ convertLongReturnVal(JNIEnv *env, jlong n, jboolean reading) { if (n > 0) /* Number of bytes written */ return n; - if (n < 0) { - if (errno == EAGAIN) - return IOS_UNAVAILABLE; - if (errno == EINTR) - return IOS_INTERRUPTED; - } - if (n == 0) { + else if (n == 0) { if (reading) { return IOS_EOF; /* EOF is -1 in javaland */ } else { return 0; } } - JNU_ThrowIOExceptionWithLastError(env, "Read/write failed"); - return IOS_THROWN; + else if (errno == EAGAIN) + return IOS_UNAVAILABLE; + else if (errno == EINTR) + return IOS_INTERRUPTED; + else { + const char *msg = reading ? "Read failed" : "Write failed"; + JNU_ThrowIOExceptionWithLastError(env, msg); + return IOS_THROWN; + } } jint From db3c4132688a40753b3b1a4c880816e34924164e Mon Sep 17 00:00:00 2001 From: Joe Wang Date: Wed, 1 Sep 2010 13:28:07 -0700 Subject: [PATCH 028/128] 6981408: Upgrade jaxp to 1.4.4 Reviewed-by: darcy --- jaxp/jaxp.properties | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/jaxp/jaxp.properties b/jaxp/jaxp.properties index de35af2c1fe..296ed0b08f2 100644 --- a/jaxp/jaxp.properties +++ b/jaxp/jaxp.properties @@ -25,12 +25,13 @@ drops.master.copy.base=${drops.dir} -jaxp_src.bundle.name=jdk7-jaxp-m7.zip -jaxp_src.bundle.md5.checksum=22e95fbdb9fb7d8b6b6fc0a1d76d1fbd +jaxp_src.bundle.name=jaxp-1_4_4.zip +jaxp_src.bundle.md5.checksum=2c40a758392c4abf2d59f355240df46a jaxp_src.master.bundle.dir=${drops.master.copy.base} -jaxp_src.master.bundle.url.base=https://jaxp.dev.java.net/files/documents/913/150785 +jaxp_src.master.bundle.url.base=https://jaxp.dev.java.net/files/documents/913/152561 -#jaxp_tests.bundle.name=jdk7-jaxp-tests-2009_08_28.zip +#jaxp_tests.bundle.name=jaxp-unittests-1_4_4.zip +#jaxp_tests.bundle.md5.checksum=51845e38b02920cf5374d0331ab3a4ee #jaxp_tests.master.bundle.dir=${drops.master.copy.base} -#jaxp_tests.master.bundle.url.base=https://jaxp.dev.java.net/files/documents/913/147490 +#jaxp_tests.master.bundle.url.base=https://jaxp.dev.java.net/files/documents/913/152562 From 1cef1a3806b9d2a6cd33b745bbf0b1256be68643 Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Wed, 1 Sep 2010 17:37:45 -0700 Subject: [PATCH 029/128] 6977887: (doc) Java 6 API missing info about encoding parameter in storeToXML method Reviewed-by: sherman --- jdk/src/share/classes/java/util/Properties.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/jdk/src/share/classes/java/util/Properties.java b/jdk/src/share/classes/java/util/Properties.java index 4012f2f5e6c..6f9c562e4f8 100644 --- a/jdk/src/share/classes/java/util/Properties.java +++ b/jdk/src/share/classes/java/util/Properties.java @@ -912,9 +912,13 @@ class Properties extends Hashtable { * *

    The specified stream remains open after this method returns. * - * @param os the output stream on which to emit the XML document. - * @param comment a description of the property list, or null - * if no comment is desired. + * @param os the output stream on which to emit the XML document. + * @param comment a description of the property list, or null + * if no comment is desired. + * @param encoding the name of a supported + * + * character encoding + * * @throws IOException if writing to the specified output stream * results in an IOException. * @throws NullPointerException if os is null, From 183a7b7797b244ef3d3d86d8b6732245b016b9af Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Thu, 2 Sep 2010 23:10:05 +0530 Subject: [PATCH 030/128] 6458749: TypeParameterElement.getEnclosedElements throws NPE within javac Reviewed-by: jjg --- .../com/sun/tools/javac/code/Symbol.java | 3 + langtools/test/tools/javac/T6458749.java | 62 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 langtools/test/tools/javac/T6458749.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java index 9faa4b06f74..4d5f63e3ed9 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java @@ -579,6 +579,9 @@ public abstract class Symbol implements Element { public java.util.List getEnclosedElements() { List list = List.nil(); + if (kind == TYP && type.tag == TYPEVAR) { + return list; + } for (Scope.Entry e = members().elems; e != null; e = e.sibling) { if (e.sym != null && (e.sym.flags() & SYNTHETIC) == 0 && e.sym.owner == this) list = list.prepend(e.sym); diff --git a/langtools/test/tools/javac/T6458749.java b/langtools/test/tools/javac/T6458749.java new file mode 100644 index 00000000000..b71712cfe88 --- /dev/null +++ b/langtools/test/tools/javac/T6458749.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6458749 + * @summary TypeParameterElement.getEnclosedElements() throws NPE within javac + * @build T6458749 + * @compile -processor T6458749 -proc:only T6458749.java + */ + +import java.util.Set; +import javax.annotation.processing.*; +import javax.lang.model.element.*; +import javax.lang.model.util.ElementFilter; +import javax.lang.model.SourceVersion; + +@SupportedAnnotationTypes("*") +public class T6458749 extends AbstractProcessor { + public boolean process(Set tes, RoundEnvironment renv) { + if (!renv.processingOver()) { + for(TypeElement e : ElementFilter.typesIn(renv.getRootElements())) { + System.out.printf("Element %s:%n", e.toString()); + try { + for (TypeParameterElement tp : e.getTypeParameters()) { + System.out.printf("Type param %s", tp.toString()); + if (! tp.getEnclosedElements().isEmpty()) { + throw new AssertionError("TypeParameterElement.getEnclosedElements() should return empty list"); + } + } + } catch (NullPointerException npe) { + throw new AssertionError("NPE from TypeParameterElement.getEnclosedElements()", npe); + } + } + } + return true; + } + + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } +} From caef089b98c925c5f38d90cb0ba308eefd11849e Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Thu, 2 Sep 2010 11:09:09 -0700 Subject: [PATCH 031/128] 6981759: copyright header fix for test/java/util/Locale/LocaleCategory.java Reviewed-by: okutsu --- jdk/test/java/util/Locale/LocaleCategory.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jdk/test/java/util/Locale/LocaleCategory.java b/jdk/test/java/util/Locale/LocaleCategory.java index 2b6c110e21e..433afedbe76 100644 --- a/jdk/test/java/util/Locale/LocaleCategory.java +++ b/jdk/test/java/util/Locale/LocaleCategory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -16,9 +16,9 @@ * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. */ import java.util.Locale; From 9a37a1e77614947b2292f3cd61af2aefde85a937 Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Thu, 2 Sep 2010 11:13:42 -0700 Subject: [PATCH 032/128] 6930062: Need to remove or build as part of the test file jdk/test/java/util/Locale/data/deflocale.exe Reviewed-by: okutsu --- jdk/test/java/util/Locale/data/deflocale.exe | Bin 36864 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 jdk/test/java/util/Locale/data/deflocale.exe diff --git a/jdk/test/java/util/Locale/data/deflocale.exe b/jdk/test/java/util/Locale/data/deflocale.exe deleted file mode 100644 index 43f10ba4bda71578601aa3d62e251274ba427e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 zcmeIb4Om>&xj(vx*^mtk>`4L!HPML@YeX$dqTnQENEkviBts@Jp%G#fkW2|s*gGF> zh!gir51Z}O^qjW;(^HR{#-7@b`>(gPY1&$aObSs`&4+EN=26n7x^bsUObSGheSh!T zGX%eSd+$B}=ehSj3|X_*de^(Y-nHJf-u13`P0GKpm$P#m$HSQ>#~p-E9}oNf$6v>g zoO$)HGP!3`e>eZ2ZT0WwuW#Ja?rLpod7y3cR@eQTo10rC*M0S_Ho4igrP)=o*6-Td zQdfU-Mn+n0yy(a6&K0lUx7(R;1s$^UHN*=#B)$wiJ%L7Z9HXy)g$q zDKJfeX$nkJV44Ec6qu&KGzI?ON`Xr4ta5f&V}8iP>2s1fPC3kLUcuM6hyW=JAT;te zj%$44J07mlhNGocE>xJ=u2w`DY&D_2jsvrDcq(cVp;ij(rlPJV)Tcjz$`dMTor-!7 zp++p!Ag4Fu@Qt=b%f~AkujZ1tAlG;=FdEUakeMx@F_CUD@>h_#&)bjUxM*enx~TV* zFG#4nfT|&@nau-}TGbc^DC#}p(+?$4$quc&zam!LxoCN~ zLSJT~_Ibl4s3GVCxbo~e{dx-=^`7++8r7Ki)3Q4?54SGJnb~t$8|5rBI|m_O<2O); z{v_*`5HvMpHnX#+b*v$$tcD!^NJFeHI0)&lH8Bj`zGEtS;fOqeN-7$U5;FRxKgddT zuvDenwx6&Lf>K<~A)Z4v&{`{ZXioRc_GIOVY0SR_kokgcW9Fs!wqz?K)wbvCqbS47 zz7Y*jBXy=}_C=cT{S6{F3!w|wBeC&S>f4bdHe_0~6*v`*I>DY{FhTpK1lYR9ae_S& zhedV(=4*8B0qkK57A+4|H0BcED;A)!kRr`2!ed$l&?`)fpiBEEwP&6Fs5N7#*F^b! z^d&wgC>LGwOlvTdLpGI-it*>5t?}10J?K#`HTr!7gFGXeuaPLKf05PW?29y_Y;=+{ zL@i2TrN^eSfc8y_y0eMG9XT39)Z*izKQRu>!@Thljn+}?qpi<%XsdJi$O&m>L3dY4 zt`N{JDj)D|H;w#BIc=AOyyKlSR<4pi(2n#B2=*TGobX;${%r3VOp;R0{|H%AfO8jc zkbP4O-#iVEa@K`$t5UtX>K%xBoqgW3%h6_E)H`6xjy~@hwDdur-VQ|==DS&bMjP58 zXx@R4i!(BS1Xj_D!SU7AT5s(Ou_{f<6(YlOYL)(V6jNOrtJ1GUAktke(X6SB4VPwk zB+=aF)E8!Q+(>_Q?UmiJg6`UwpYl2iUJq!c4($lK6}p%t-`?;8!6x0Jl?vLOd7}|? z_jLgu}!RH&6XhIH6SGEeg(lO4751#^DL$(~^_I#uJxGw&rFJO=P zeR>vSD~DP$YM;=&qjs;;-K%;>x2OAkW@T12roe7Jufypc+m`MR#33E;nzGZ~F&b#g zFy&GGIIGoRbo=#QR?(>TO5RJ_A28Ib@{YM*+?B7DJEK|Y?mxEA(JCE^*TLsq#MWYZ z#}%)@t5>K+?p{$TMenr!K^HuCZ+kYDEr#IWRU4YkF!MF9(;jp8iOS``LbJ4y!J!G$ z#4s?L0xzI-INYP#mZD0(y$3Af00BW`_sI5H{;EWmlC(GMveS46{RsGV+C)$oP0bEr z`zy5@H`Op!1NRET8ZXb2ZSEnu@UpeapN2>L@nVk=ef)ib@s@Z%OIP%Dz)3kW18609g zrv>|qYQ{L$OVq!A6h4-nwE5uZNVhBm=j#6f+-jQW`l_oFyUqSwaJW9>DvsO#Dst#g zgNyX{ufW#>(BtpRLc#lU@Z~cXJK&j%1$^tPF4Fqz0K570Cg5R@)dVe7Eg$ez==qnU zn(CN_2Fn9_Es~X`r%-m1l&t^DHK`d3JGk8U97zp7 zaM%Equh}y}YmX%Cnb-?oPWS6R%qK9RJfljtAz0loQtA+F0jVy&x<<=vYNoa(XH~>h z*YLZY0iRz#CD1YeYB-DnWz3W=(_-37J)_CW>8mw9!aWW_f zvt>!NxDhuN40m0T0k!gsS~;#(o*LW%3>2j3F3GLvcIhTX7o@Ap%A{F{iIHj~E9K+Dpw9~MgDb6o zZSYP6LgnM3!NnFNY4ApZjNKq#OG~=`cf>F-*nq|8EDMDn=|^;sM+}>-_}oiTJ`^n} zK4uK6l|zGn!|p-ZuVUE`B(e{Q(UVA__7A>@K$KT0C$g#Dp}~VJ(<NE$yuQXZHwg0l`DZ40^J9jkf2r`(=zfS zkm@Q=i3eiCCB?RobUDehrYwL^KK(&pbzP0=vl4lxCNxk5haH0p;1fwl9}pjzi&0ia z>&57|FbkB?4dNp-@5S&Ag6k{9@Z*Sr+O2R+itZ32gLaN<81ath3o=g~(BvUy!jzMr z!-D=Gqs*fypD>(4wRS`;9~HwB*rOsZ$f;V!YH$TWecn?5aabh(uqJXs48Mw4gHni! zUqr~`G2ZU;9wm%W%!T3gM1OPeL+mOqsvV%Hp;5gc%=v%}vlMnP{G5i=R0GYz%NfpF^;SZ6g46y$lFvgKDAXlIF)z2YrEXnIR zK05deAlB%!K9`Tihg}jvg`8yf80YeO1|MPBhOkOe?iuigz2hO!p7wUBrpx@SfD>kIN~q5jrS)J1pWIg4weF*!lDIeDQl~}$h zcSHDX21FSvqI!1Q?KQ7LHZ;peJ9CVmqrf~wyrZZ;3A0qXTq_?973Irlshj~M58}PH zd?YCy{hS!N02*mEC z((fvMN2WHj%PVvynKto2w~q5@v$`559PqiEtO#aJ%;aif*lTgtVJ+P~ABVD> zDmt{lW$8c0+KQE1xzm(pFoXyHvI$2w?H(LZV|P~tBHg>ML*}{2JDR`IA-k%%L)A(84%=AQ6y?Mt;I+OeLC$;zLv z)*MliL553?^EPRLPrr|7kF}@}n>$H{mfD22e4OuQ?H_`u)|Y%1->F2`Bc^qF%EIc2 zLxkU*LFHEkL}e$Y0oI0dBEK_R7kUXQH zdyrsHxgu`IWZCwQzalpigh9(qs2-2ot@`fU>Ag{he z9!9Of5D+XX;@oKTMawS)Fm6yH=iYki+_Bq_}%K zW@x?pDJ97J^kk}TKb`4G(w!gVt5kM2*Uv)uzmy;Zuh5rYz~nD@;h+!OpO#HoRDPz? z?NWO9rNnB(u$DU;&(VP&_2E0lFpglEIlrv-ygJXFp~$+brQ@SHhG=0Byxr* z;SWTu(67nxMt1r2^C%VNs59i*(bBA7l3FULDI3(%9JQ1;GPGrCZH~HIQ14W0`G!4f z97!`#_9h%JNzVc$1=1$Vb8W&@Y!zfF$FuzTx$9Tx#D=IhK$cmc;7d!Q6PuUQ6PsS z+jdEq@SZa=k$1v7W~5A%pPwin3w4}>Ai5TdXQ<YeEAs#4DUUn%H&8mD@x?Y*MAClR`SD=HFp$;1N z=|2bgs*Q9+vGC~ID5iSP7IYVR2c*;@?*%b@3Q~|V(IP%l3!W3hX^>`7j2ONVQDve| z43A<(62BH?(Fb-HDid3zD^Z~s2>?WG*E+_WRmN@-BfEjn>m9TW zei;D(qd#AQl>td|X6JuWF#7YQ_%@Q2u{?PWCY4!^p%@S7FQXi-zgn$1YuEu+ItDl? zbx+5I8cfdJkY8CKF~p7_@7J%vij2vZzK;$qUHk@RfW{VT>^hmV;a!diji`JOz+Xqb=b~m%zWZ=-t(sXY8kd-7l;kk z9b5<;%qTg{q|?X%MhTh6xZRkg@7SL2S3KNcI)GZQqPL1+I+!r2UI!jY_1{VWVi5C@ zBISw)>~8N_F|rH=Pm~*0OJcN@d!Ge!3?4-AQVq}^&?z*utX7PCpUBx4-C-O2HbOM9 zuE7kD9c&Jz^m@SkMZJ$=bJs7v zZ3$i-hrc3chL+XHsXwh*+3Wqj%dmGuG@{Z%} zd{>XbcOB|Fe#f!x^Th)v!~;Wl@0V&XYKN55Gk#|4(d{Sx5-mx7RLEJrM%HgVVLT%q zIMQ`Y>-l)H@tx2zOiUZ7s!${BpeFcElV7EoVL~4xAJhFvg+NKXn3bu0}ukXIxoaw2RNJ&Um!orO0vVUK&n$U8v(7$lBI!(dj*c z4Z~71WU%61!s)8I)BA$Cn06VGzN6klKK-t2oWwQnA1j zcn|q#v`^npB~%y5$HegU2wHRKK^ishQS=f^TpJ?P3eEc}&Txv08@!hw@HfDx?ZjHi zWXzjEo5g>hIh(Ga>ez5A9mhaS5i^0U@sYpKM4Z?muT3zg*cbxHuWvo40>v1I-H$J6ro2-2>kLZkD zg{FTIz}3~EjzM($RJ`fsr*IfOPQ{M=Ni9D$co=Yt96v<}%=zd1oqLwj;5Zs?Z&d`lIM@VZ4@SQCa8I}mHFe;ly3L;yv^$+7!HeY=p*$ky6fs= z(nor?VG_lfMe*Kk1la1Glr-|DGEr(Bn60(^W!5cB=Y?!m9pfY?W)p5~Rp=~Fsb#$3 z40W7mGmKXY4SR!HIN>!+TsO!LV>z4Yr-@?y)#8DaQg;li1&IQc2_Y)3ddp#$zW^ri zGE3b@2#ig9`2v7+)hEWjYG?N@YDVn0UL zBZqJR_yM~V(Y0cTwbHG)XHoDNB#vFXc;B{kV^na3IIf2--zQMs#aMu%xt>7*kp}` z8*OjTm@K!KH~z+s41P>7eKB|h<06J##6uf|$m?P_8$o3(8C&nY0=l|kFoOYbz8*$p zT1Fw-ua=YDfy%;AZz>lBF>-{ZZU}pDa=QoL_TyFV7dx_}i&o_wk1qPTu7DUg#`HSw zl1HFjSX>93rI4w*aiyJ15d{SptxNY#0qr4B&C;(=0fh;4*V2ER0*Vmm_NCD&poa*Q zyY!JMpsx~W=F)#9P?}X^7eFR!NKi0OR;w&nU26!`^$I|61G1m`ORSVi=j-e;P!^XU z#1~q|y=Zk&_5gZTb&$R#>Mi<8VWr!FdrrQ{DgQm{SXCQ!L<#EdA&>;+N6cUFdeJ=L z2~uvz$@(qWEVRXRCstr~rQ8vdW-VDN*;ZERufq1AIx3~u3_Z&KhUT14@5})5P__HK zx|nXvaNCxu&-g3ww53!+;nh-6WkCNA6%L2k4)}ZwVJ}v`(Z>-9WZax z`I(qON-tk+|FH0C`Gp#jHA4RxPPNtQJStATYEx}rGLM$pP&>Oltf=^C>)XK`&n-by zn1xZ5-^^YOI_;y&K6P;};MzoC4zA##78!*=Fz)mF19~}1gUSQSl_=lo(|_imPT}6& zeI6|o^xLR~34G{DqWo8VRRMht%S9^fGL_vCZmQi+mxS>v;&NPqXZfp?`Oq>t>3*t@ zwHgB%F(pC0UFqXVEU?EVcKvNoPtZ>%St^g z{CgHQUS<&?s9s>1FsD$QwvG%%7LJcT3k{pYDo=!kSZSypOEck z1}ripKGb01{F%c+)h&hx(6cTl;U*IvslFNf2;fs2uT^H5Nqt^{Mx)^MP~kl??^$7t zP?K(i)>U3WIqa1)m!e&di@nRDFGPTma*l*|>>klvJg zN=@6{^7$?&+Ig4Kk;BPp)Rbjt3U>Prfs<|q;^kAim}1e#q7AeOlLWMbYNpLIxB<&Q z>m>+g+6L!P)RgSX=P>M9*p*1HSy8diqj@-grFPT3m@+U0c^$?eraLAVn7`MC+~*~% z4unCyHLf?a?*W!J>K+rr?*L+@B_T8jUWXuS6C-;Nz#MW|`Ni-d#2bpP(t4##kEfw1 zN4{uz@8|VuOE;jnsJM@Tb*6f zZ$=mO%jJ>RdrSE}a&mBZgOR4i%0~LH>{hz}j)EJB)T4@NN^?N?cr^}o1+Lyn1DX#HsX4jz*8Y$&)2~>MQt_Y@Gjie(KztN34cCg0p z*B_(ZLVp;d6sD4BE+&APEg={52U!T;cKl9+|NokLrTb%u8%I- zra6A5!Y)QFb11uTgDKByv|)y5B|j5%4|1F9eIz={qN92vY#EOpty*zw{)QF#`Os!6 zX9cvqavXXxtlJ|V)=4q)5UOBzU8JnX#-Oek*V-N0R|M+8=BQ(vvg;9^le|@x(Jwm9 z^^fp1&}cc*yQP91OMvCqe*iTI%=nNBW2!e;L_oHnO)Ggs&^ME?%0Hs6a3HUM3`o)z zJ!0%TNPRQrGV@6zn+gw_e*G~ke~o2T86T8NjEbNw)Qac&wBj6}zB7)59_}NX6s%8D z1_t~FWogMCtZDN6#&Hy`Lj}$4E5RxUDVd3-WOflZk7MfHCutBW1*pb5K}WY!N(TcK zFQxn4UFWKBDe{)x{VhroBXfb8s0^3ZD2Pr3@e0N89|73&0o5vo&*3{7xd)A8`!?(b zt&JNQX2;>zOAuxCH^J7`)fOn=i~feP=yyO_@4-#gl5GpE6rcV%fanf{(iPnuwA)7; zb5TM-?|`HVaXK2g7i4Y}SgB-nVgYcVd3Z9?$g|Y10AL?%`hJ@tQ#66X<7OQ^_I~mMHxt%B%x2t1xXk%8v z@$0QrA2W)rHeA|_P+dO%VH7tm*d9LXJ|$*dHn8{;jhn!eR ztdE~i?L ztdeK@f)@!?W9Cd5^!B+Q8}VU`xGl=}NOp~jecDAH z+e->gs2Oy}chK`MSYQOng#~6gyDHjsPPsU{ZJu&5cYBUCxU|~GH2(J`K;2I)5!-X| zS-{$6?Ya0OdP`At(A!Z?Tzgj5M1m*Tde{E(YJ;QOhC8a z;GWlw9NRPeI(wurS{*Uvyegc~;+y1Nq6h4bRy}+!E+ZdNju`&Mqu*acD89sdsrx;>%oV%2XtX*>$j=AV*{lCD8 zEK;rHKFuXei=So640AEHfezm~?YbnO;WBSv`!xXZ`dolW@o^c60TP|jd3`6UA=n#W zPG+0!Ud%e2UZp!lD{1aW=u$<@X9)<@ckB30mc<3HLq5(fs&PtAIx}M9_0qi^v{gB{ zRm3s1XdW@PJRAG1`z2{c1C+H5stw|WaXO)?ifeDn_mRF9`_t|lioDKUpD%c!s74UK z*~5$_s)DHrUjGK;b%reeCotQR3u|rizkP)1jW8~%C^rNi$fdSVWEUelu?rY4CRBl$ z7+j`9vIq!%#Npby5u&R|TB|D1H5fzUq8;1Yc1OJRzu=3Fb=r|CZ82f@Kn-!=_;5*; zEmSLIhUzD{&hqh2?}x!8BQ;e2A>XUzl{8Vtlnh0bzuZUsNxss77vD8yZQW~?q9Q>b% zIcy1AQW*0egUv}bE_Lai+1!?6ZWHJ_`}eFf4qQ58Np2zm`T?!VF?{GDd6Blp8Bi{o zQkHhH$7JTBOMb)5MVGu{BtK8)qFrnGO`+2dg)Tk>S@&g^TIJZYJBPzkFK20MV2CeB zj^W?(Fhwh6+mM!7hI*J{Ftaws1nB{%((O!*+rQG=0@8g6*cq#EXMh6}brCkrcpY%- zQ%Um8%5H%p<5!;gqNTV?1vypO4Y@PRqoxd(Iy}-$GgC`}@<0Rt8w%u20(9n}AhVQ* zc`cdNYB9@D^>qBLgOm#sC#*jZr>dkhpB|+!uF5YlQiw59VsPP;eT`rQ;}+f;( zM0K5WR>rG%*GN|9;9$gbpqeeN1=VIw>OoHfe^Gc?`rODNR?{rbN#Z3=po^b<6dD_tiiU%L(DEXNt0;8h;1MhjMfp;j z(w)D2=|L>eyUs9qbx< z-r|24eXJiX3b{G$CF#bl3LEGFB@PU!K5+MK&(bQ#yZ*Hs2*O?}#^dhW_V?oAP!Wf# zF}zEN;cj}IZ|lLL(wBS`eMZYU-+t;nd*l#3a1?o;??(K4->cqFZU3H8i2`<-kg&_J zcwr&2S}1sylCa)(u1bFxzJ+|LP$Na1M->!wv(kR_qaPU=Mf1wADodF*Q+#2A zvSV`N6k!Rc$^yawRVQR;UowTMf#!lI7^y$}DDY7R9GAs?B#vD|XEMP}PhwY+u2FOz zb`5%lA4V;GU?xg)|25tNBVJ`Mq2RVcpbn~4&PJI9gR|z4cg4% zLooZdhThrrjby5%bMF9pZ_FJ&lq5N=Bo`&2Y~wGXCn%Bg6c>X4&l{`aR8dBY+b&l| zzpy z;=W`8&|IMb3XqI|mojuE+@l@0_qr#x3GPwxp&h^&=_7GP&H|C~A`Ke+wuR@vXXbu$ z!`+as`hG=;${^q7PzLPwBe246y$iI?jW!~AFZ{EJ?hWDV$8g8su07s`$824tw$7Ed zuF@nF+qp7H>9s3;tnj0gg-2Ii!ev-Cr8i0GOQI(H*Cf_ntGrTRtfZ8OCsUArEgG=| zZV}v#aJg`E;j-Wya9YXN&Zs4ioPn>y*WsUqe-{1_{2}-k;9r103V#&-IDDv>qv$q= zcR8a8N|@B)R=8bod#P-%P`l}c*k0=G)Ueg_I0S9{2sJ>81a4HiWjwm8Xgp5;+)MP& z`0)Jq#!>IkYSdzm{0UTk0zs6O7>|qAc;wM|jG`^TAmqIQzOIM!!F83|uRY$m(!K@- zuO-SIm{KgYE1rI7jNVOB-ec5%cnap;DR^i-dKVw7ckRl1G@{}|UjXY&$$_$;MEyU8 zdj{@VxWjNq;a-J%8xC}y3p&q*p94P!einS32EXQnk7L@`9Pn`<`fX~C{KRPZJ zeYkQg?r=G9H^L?8i*}>;Q^tYC(c39wVBuJ>kBnQR2b^(9NFZrD(!Kv67+AL9==3yk zva;YA@`ASgKZf6z{3O0{B_<|D?!U(ET`f{ zjROxJZFnspKiG4T4=!7^Nrj#2E8Cd$$LiUg95L7oV8G`99{JVyw50iY)e+r=NIiYsm zXGIFyDqg+I3iH}3LA^`RDo1ez&&jEH?<9s*)PkoEw7C&KLuLLDL=RFE_i(q1`ffM}_gPsXApPnV?T7z-JaGrD$wrC3cL;AL@0mSr;!+jUhTBKej@0mPQZqB2LQGq_3sbY_v}iAL{F)0v zEyj6ZY*K-%3zp8Z#EFyY6Ie8!)8ka0?4%*K%GEs1iLwj|^nC;<0?XoAP|9XCO&C!Vs~Wubz3fB3hPJ;nN?XyFI+} z#B1dYViI>U^=X@3(X+G+%Bp4%Gm*K1u%D9D#neqE4_T}-r5b-#ln=rD_8}k>ZZ121{f3?*czlF9btt{gKy!DrNcg*AT7N?sno0>Z<2^OyFTAjix6JX)=j)fCFp^kK}6A(F_v7+|!$@fy-lR>mS zbysJJ@%br;8PPQfwoUyC7M1bnv#hlMKZp85C*MuI9m@`$e5I>t>gt)}XfhTydB}b| zy2eJJTgNdzT4v;h=uVq@r+kHb9!+`J5tom<8T-mJ;(HAsst{eyGe)pjAcOWBT$7sa z9yvc+qWZvckiUtE0tvo+3ViAAlQt{X=EOFzcy7XLJY0o zr*uP*Z{%FGreMp$Mc9+^6bF9tVw-ca5@LRwTjnTh1QS;6yLmI2SX(P~;*wA6g`E#L zw}S0&0qsjp=%))_k91=`4dAj`iv^c$>89=N3(;^s+uQH}!y~939(u>SK%TK6-}AO; z-|1k=aMn8UE;0UFfm(YqXKnV=T)O5I~6ocioz z#C%<)E4q$M^n|;y^mMLSA=^`T@NAjYUOM^C$cgzrf&FN}3zl)mYK<9pEN^VZg@&2^ zGzdmF*HFkT{xQOhbpQvcIgiwr__;I5J%0&10l8 z=IOdMp^FVDui%F&98Y=JPh%K&Jf%pBs`Lxb;%upn>OV=v+=7zrfTrVK)rGhQw4?dFanrIX;qE8C;{XA3`-HiFM|%jqz(J247#Sy)x2|2Qu01h{^GYI z;%|fS>dneC_&72!jSVfBMKw9Hz*GmSHwU&2>>-inby?~>!2=y`j+sq*U%Y;XcKLoN zV4_QKCQ-WWx#Rk)AO$+0;raKefWJyV^DCx!H`0l!c$81}9C%G>LQ}mE5A>_7@?k=k zC>2HG=~5OnNpyKey`{^uX#G)0WOewh0emjW0SKxFH?c0)Q{rD1MJChOY@5K0M6?2eZz;!qJhPDaK0lVDD;1*O2G2=$`f22Nq9D!;zZgDK>*>HD`)CPDu^mTiAqC4a8dUagW7xw zue(^AXHB*lkI&Ev4Yj{1J%bfYKJ&4rp}~)$J%NDC2LeWl)tD;3b=yq6qN`?Dg+bu_ z5~h^aJ4ioUg)=r(1-K_aQ5C(*lrms7C*gJGxmCDDJC8`MoScW`n09E&r4H8R|6BU8 z9kpn|r|8G_)?ls8jdmiL^kWY4p8)JA+z{M9r5~fhp+}j-jq6-KrXM4$PuGvd^S1!u z9=P>ztKmxEmcT87yAck0mH!6)7^8&AI*c+Og?pOH{$H*ibKZ+uEd5ybCPuHscudug z;K*)QqN4N~G6)vII`h?gEZ^U|vJM~RA zJuS9LTLSw1Z(>iNOZ6p+X@gK@CdrpU8e0u846k&31p?LX-&RX=1N!Y0hLCcEEy{S7 z#%yUc9Rk7M0{Y``fYt5QWJkkA{wAeX>LrA4WJAvV46}%ujZ-dGrFl;Y(&e}&)&KAp zsPgwTI7Y^BS*51XOWjgF@k38>iMe7aJ0QTGt1WBKAcb$DuZWGo+t215(GEv!+G)Iv z_wc^hQFB2Ut)Bi&Q(&3`(-fGdz%&J>DKJfeX$nkJV44Ec6qu&KGzI?GQs70I<4(a1 z!95E{pUiC>mkYNDt`u$qTr=EmxV>}4$cGj1-MqYPPp&F zJp*?b?gZQ!xcA|>9jFWL3b^aw3gOD&*24wiw!wwq9)^1q?uT&C!X1Ts18xXz9L}+m zM+sfxA6FKj52z zxC^%u94Fk{crQNaKy5X66VC~etV z@2YQWYiVo_SVh!*Si`}cT>yuEmJaX zmbSDsU&?peXXa~{>i$8##gwmAZmV}~+tMba`XLEHvYfIrY2SawQJF5mcOZ` zxqinM>GPZMKNfD0ToQG0vR$_nQNBz4ZfUJY!7a`0EuceP{kARlPr;4TsD4Ll{rysX z9iz-8Dsn`hTNr(0)ELLvDmO`6q{g=T&2^yA{a^ez{%6xAo{9cnL^L-eZS#H2Ep1yt zfW-fIDb=@a-O~I~I_IdC2V_EQPtZ62R-#iw zQwyqVe!$h*vZYyK(*TgV`Z|lASaO=%=O-(3x%7^&&>l-}WH{s|* z@wYeP+69in-?_)bJq~wPV#(GQ)*SYKSjN{a0^WcgWuXn9_WA$YTDQ@*uKs})O)c&9 zch~RazDhBFy;QZiNv`*T)ZAAHQX$v3?YsnQBiLGS6|xXgaYjC%q9oNm2fM-KT*0RL zl{U%kjipX*w64Jd}=-b@O#ZIS8;#yys_KF)%PropCw)gZUEfqN3={BKE>&5fwB zslLv;4z-9P0@+v@ARmpIlhwShwD($794CBU6X z3T&yXU(vX^ZGB5QtvbthO7&a{mH)|tIN{Ub0gl_6gh4H1&0Wy~<^``3u3xINfE<@i zaiYNbovrnp&r02l)w$IgjQ_NiVb3V3ZfgF>3@l?)juDYaOQ!a*wk#7UVvk zv`%WOY~BtYhM54`KsESip&>f$BFL0Be4FJgZo-<%ov}^!cYRBO2;B2*Bz)8)?w1rU zUV%;c7HaKUZ#jj3ooI_y4EJ4D=DK<-dM9Dh5Ej?fwPD(E+#%a)takB*45Q??dQKxl zlmMjaqYzLtCutp)el}gW=WVN3ly7de#uC`wQ{%wBl4HyjC-dFjb!)t<6P)sC>&rB3 zngY`ln5Muq1*R$R|3wOH&xK9FD$iuo=PtMuP5|lry4LTqL^{{?P4{o9yTi3$$3i+N zENFLKPk0O37rJg@@icBlOEaX7CYNt>bA8i2t4MgTj!2uEII9rg=hMlbn~Z-%x^y*c zhTKu-+KyA3OKMDEIw=~tQk+`7E$O?tOL0Zu&D#fq#|)uGE_{YJg0RKClGrPPc;GJcMCo$3EYh5{@EFIxYHq zZAuuXdz0|JQ^K$rorM4El<>bz36qgHG-`}b=z%kx;VD9F;7b0t%i(?GL-YKZcD&7l z-w8hz{yp%C&kEsFJ_r1n@K3dQxLNQI!k-QQVfZ=l*TbiRZ-jpZ{0rd6E8#y2e=huQ zz^8>K3?FI&PJ;hs_;v8d;ol42gztlYRp8Uz9r(cra_Ge;{;r2s(E9si+9x4p=+i&? z3v-|R`zZb%?$V!)`{(|qmhcdF=`RT@%|G*($nOFLra#vDeHjRmSgUE?Q<(US<|O!! zBV%;vqS>4#p1`X%HqXhYc}_mfb4nv#B_1Fcl}mZa$I}y5t}_lJJ|G?-NA=BzBizOD zcyT_Ucfqy75%09YQCq1W)SeI=wRun6e+WLM zD{zz^hNJd;9d04qWAXSt_|)Df;i$gv!x7#u;HZ7{D1p-d2uJBTAPUjK26uDZhd24L zCDG3ipga)%-iLNRG(Vp5UvFB0ec!YEJ&z9%i*ugcA?7~?{GR=ecKN&au^bhcC>5{OzUJaKy%v1!)=%P}?0;k6 hBJ?G@6D_k)Mp4i7XPN@j6qu&KGzF$9@PCy8{|CCnGJya9 From 753b8d0fea0ba9ddb0e8554eff5f5b8846c379b2 Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Thu, 2 Sep 2010 18:26:21 -0700 Subject: [PATCH 033/128] 6921495: spurious semicolons in class def cause empty NOPOS blocks Reviewed-by: mcimadamore --- .../sun/tools/javac/parser/JavacParser.java | 2 +- .../tools/javac/parser/ExtraSemiTest.java | 100 ++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 langtools/test/tools/javac/parser/ExtraSemiTest.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java index 84752f1b8f9..3ca8b64dc8f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -2781,7 +2781,7 @@ public class JavacParser implements Parser { List classOrInterfaceBodyDeclaration(Name className, boolean isInterface) { if (S.token() == SEMI) { S.nextToken(); - return List.of(F.at(Position.NOPOS).Block(0, List.nil())); + return List.nil(); } else { String dc = S.docComment(); int pos = S.pos(); diff --git a/langtools/test/tools/javac/parser/ExtraSemiTest.java b/langtools/test/tools/javac/parser/ExtraSemiTest.java new file mode 100644 index 00000000000..16c16ee9b35 --- /dev/null +++ b/langtools/test/tools/javac/parser/ExtraSemiTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6921495 + * @summary spurious semicolons in class def cause empty NOPOS blocks + */ + +import java.io.*; +import java.net.*; +import java.util.*; +import javax.tools.*; +import com.sun.source.util.*; + +public class ExtraSemiTest { + + static class JavaSource extends SimpleJavaFileObject { + + final static String source = + "class C {\n" + + " int x;;\n" + + " class X { int i;; };\n" + + "}"; + + JavaSource() { + super(URI.create("myfo:/C.java"), JavaFileObject.Kind.SOURCE); + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return source; + } + } + + public static void main(String... args) throws IOException { + new ExtraSemiTest().run(); + } + + void run() throws IOException { + File destDir = new File("classes"); destDir.mkdir(); + final JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); + JavaSource source = new JavaSource(); + JavacTask ct = (JavacTask)tool.getTask(null, null, null, + Arrays.asList("-d", destDir.getPath(), "-XD-printsource"), + null, + Arrays.asList(source)); + Boolean ok = ct.call(); + if (!ok) throw new AssertionError("compilation failed"); + + String text = readFile(new File(destDir, "C.java")); + System.out.println(text); + + // compress/canonicalize all whitespace + String canon = text.replaceAll("\\s+", " "); + System.out.println("canon: " + canon); + + // There are no empty blocks in the original text. + // C will be given a default constructor "C() { super(); }" which + // does not have any empty blocks. + // The bug is that spurious semicolons in the class defn are parsed + // into redundant empty blocks in the tree, so verify there are + // no empty blocks in the -printsource output + + if (canon.contains("{ }")) + throw new AssertionError("unexpected empty block found"); + } + + String readFile(File f) throws IOException { + int len = (int) f.length(); + byte[] data = new byte[len]; + DataInputStream in = new DataInputStream(new FileInputStream(f)); + try { + in.readFully(data); + return new String(data); + } finally { + in.close(); + } + } +} From 60cf6eb1de8a76b3d6b32f716f2e203b1168c17b Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Fri, 3 Sep 2010 11:25:43 +0530 Subject: [PATCH 034/128] 6458823: Messager messages on TypeParamterElements to not include position information Reviewed-by: jjg --- .../com/sun/tools/javac/tree/TreeInfo.java | 4 + .../tools/javac/T6458823/MyProcessor.java | 55 ++++++++++++ .../test/tools/javac/T6458823/T6458823.java | 87 +++++++++++++++++++ .../test/tools/javac/T6458823/TestClass.java | 25 ++++++ 4 files changed, 171 insertions(+) create mode 100644 langtools/test/tools/javac/T6458823/MyProcessor.java create mode 100644 langtools/test/tools/javac/T6458823/T6458823.java create mode 100644 langtools/test/tools/javac/T6458823/TestClass.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java index 6f185dbe593..aa339d1d809 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java @@ -501,6 +501,10 @@ public class TreeInfo { if (that.sym == sym) result = that; else super.visitVarDef(that); } + public void visitTypeParameter(JCTypeParameter that) { + if (that.type.tsym == sym) result = that; + else super.visitTypeParameter(that); + } } DeclScanner s = new DeclScanner(); tree.accept(s); diff --git a/langtools/test/tools/javac/T6458823/MyProcessor.java b/langtools/test/tools/javac/T6458823/MyProcessor.java new file mode 100644 index 00000000000..43e96b131cc --- /dev/null +++ b/langtools/test/tools/javac/T6458823/MyProcessor.java @@ -0,0 +1,55 @@ + /* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.Set; +import javax.annotation.processing.*; +import javax.lang.model.element.*; +import javax.lang.model.util.ElementFilter; +import javax.lang.model.SourceVersion; +import static javax.tools.Diagnostic.Kind.*; + +@SupportedAnnotationTypes("*") +public class MyProcessor extends AbstractProcessor { + private Messager messager; + public void init(ProcessingEnvironment processingEnv) { + this.messager = processingEnv.getMessager(); + } + + public boolean process(Set tes, RoundEnvironment renv) { + if (!renv.processingOver()) { + for(TypeElement e : ElementFilter.typesIn(renv.getRootElements())) { + for (TypeParameterElement tp : e.getTypeParameters()) { + if (tp.getSimpleName().toString().length() > 1) { + messager.printMessage(WARNING, + "Type param names should be of length 1", tp); + } + } + } + } + return true; + } + + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } +} diff --git a/langtools/test/tools/javac/T6458823/T6458823.java b/langtools/test/tools/javac/T6458823/T6458823.java new file mode 100644 index 00000000000..f02389dc304 --- /dev/null +++ b/langtools/test/tools/javac/T6458823/T6458823.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6458823 + * @summary Messager messages on TypeParamterElements to not include position information. + * + * @compile MyProcessor.java T6458823.java + * @run main T6458823 + */ + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.tools.Diagnostic; +import javax.tools.DiagnosticCollector; +import javax.tools.JavaCompiler; +import javax.tools.JavaCompiler.CompilationTask; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.ToolProvider; + +public class T6458823 { + public static void main(String[] args) throws Exception { + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + if (compiler == null) { + throw new RuntimeException("can't get javax.tools.JavaCompiler!"); + } + DiagnosticCollector diagColl = + new DiagnosticCollector(); + StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null); + List options = new ArrayList(); + options.add("-processor"); + options.add("MyProcessor"); + options.add("-proc:only"); + List files = new ArrayList(); + files.add(new File(T6458823.class.getResource("TestClass.java").toURI())); + final CompilationTask task = compiler.getTask(null, fm, diagColl, + options, null, fm.getJavaFileObjectsFromFiles(files)); + task.call(); + int diagCount = 0; + for (Diagnostic diag : diagColl.getDiagnostics()) { + if (diag.getKind() != Diagnostic.Kind.WARNING) { + throw new AssertionError("Only warnings expected"); + } + System.out.println(diag); + if (diag.getPosition() == Diagnostic.NOPOS) { + throw new AssertionError("No position info in message"); + } + if (diag.getSource() == null) { + throw new AssertionError("No source info in message"); + } + diagCount++; + } + if (diagCount != 2) { + throw new AssertionError("unexpected number of warnings: " + + diagCount + ", expected: 2"); + } + } +} diff --git a/langtools/test/tools/javac/T6458823/TestClass.java b/langtools/test/tools/javac/T6458823/TestClass.java new file mode 100644 index 00000000000..09295a0ce00 --- /dev/null +++ b/langtools/test/tools/javac/T6458823/TestClass.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +class TestClass { +} From 977ad1ae6a41fa4811980d0832f9a3207a4bdea9 Mon Sep 17 00:00:00 2001 From: Athijegannathan Sundararajan Date: Fri, 3 Sep 2010 12:36:43 +0530 Subject: [PATCH 035/128] 6956462: AssertionError exception thrown in the Compiler Tree API in JDK 7 Reviewed-by: jjg --- .../com/sun/tools/javac/comp/Attr.java | 12 ++ .../test/tools/javac/T6956462/T6956462.java | 126 ++++++++++++++++++ .../test/tools/javac/T6956462/TestClass.java | 30 +++++ 3 files changed, 168 insertions(+) create mode 100644 langtools/test/tools/javac/T6956462/T6956462.java create mode 100644 langtools/test/tools/javac/T6956462/TestClass.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index 12eda0898ea..832d9cd49df 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -328,6 +328,12 @@ public class Attr extends JCTree.Visitor { attribExpr(expr, env); } catch (BreakAttr b) { return b.env; + } catch (AssertionError ae) { + if (ae.getCause() instanceof BreakAttr) { + return ((BreakAttr)(ae.getCause())).env; + } else { + throw ae; + } } finally { breakTree = null; log.useSource(prev); @@ -342,6 +348,12 @@ public class Attr extends JCTree.Visitor { attribStat(stmt, env); } catch (BreakAttr b) { return b.env; + } catch (AssertionError ae) { + if (ae.getCause() instanceof BreakAttr) { + return ((BreakAttr)(ae.getCause())).env; + } else { + throw ae; + } } finally { breakTree = null; log.useSource(prev); diff --git a/langtools/test/tools/javac/T6956462/T6956462.java b/langtools/test/tools/javac/T6956462/T6956462.java new file mode 100644 index 00000000000..ef28b17c1a8 --- /dev/null +++ b/langtools/test/tools/javac/T6956462/T6956462.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6956462 + * @summary AssertionError exception throws in the Compiler Tree API in JDK 7. + * + * @build TestClass T6956462 + * @run main T6956462 + */ + +import java.io.*; +import java.net.URISyntaxException; +import java.util.*; +import javax.tools.*; +import javax.tools.JavaCompiler.CompilationTask; +import com.sun.source.tree.*; +import com.sun.source.util.*; + +public class T6956462 { + public static void main(String[] args) throws Exception { + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + if (compiler == null) { + throw new RuntimeException("can't get javax.tools.JavaCompiler!"); + } + StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null); + List files = new ArrayList(); + files.add(new File(T6956462.class.getResource("TestClass.java").toURI())); + final CompilationTask task = compiler.getTask(null, fm, null, + null, null, fm.getJavaFileObjectsFromFiles(files)); + JavacTask javacTask = (JavacTask) task; + for (CompilationUnitTree cu : javacTask.parse()) { + cu.accept(new MyVisitor(javacTask), null); + } + } + + private static class MyVisitor extends SimpleTreeVisitor { + private final Trees trees; + private CompilationUnitTree file; + + private MyVisitor(JavacTask javac) { + this.trees = Trees.instance(javac); + } + + @Override + public Tree visitCompilationUnit(CompilationUnitTree file, Void v) { + this.file = file; + for (Tree typeDecl : file.getTypeDecls()) { + typeDecl.accept(this, v); + } + return null; + } + + @Override + public Tree visitImport(ImportTree imp, Void v) { + return null; + } + + @Override + public Tree visitMethodInvocation(MethodInvocationTree invoke, Void v) { + invoke.getMethodSelect().accept(this, v); + return null; + } + + @Override + public Tree visitBlock(BlockTree block, Void v) { + for (StatementTree stat : block.getStatements()) { + stat.accept(this, v); + } + return null; + } + + @Override + public Tree visitClass(ClassTree clazz, Void v) { + for (Tree member : clazz.getMembers()) { + member.accept(this, v); + } + return null; + } + + @Override + public Tree visitIdentifier(IdentifierTree ident, Void v) { + trees.getScope(trees.getPath(file, ident)); + return null; + } + + @Override + public Tree visitMethod(MethodTree method, Void v) { + method.getBody().accept(this, v); + return null; + } + + @Override + public Tree visitMemberSelect(MemberSelectTree select, Void v) { + select.getExpression().accept(this, v); + return null; + } + + @Override + public Tree visitVariable(VariableTree var, Void v) { + var.getInitializer().accept(this, v); + return null; + } + } +} diff --git a/langtools/test/tools/javac/T6956462/TestClass.java b/langtools/test/tools/javac/T6956462/TestClass.java new file mode 100644 index 00000000000..8c310b59875 --- /dev/null +++ b/langtools/test/tools/javac/T6956462/TestClass.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.PrintStream; + +abstract class TestClass { + private void test() { + final PrintStream out = System.out; + } +} From fdaf5c86b2d42dc2ce1812881af42a53beff6665 Mon Sep 17 00:00:00 2001 From: Anton Tarasov Date: Fri, 3 Sep 2010 11:08:41 +0400 Subject: [PATCH 036/128] 6867293: switching TAB in a browser doesn't deactivate EmbeddedFrame Reviewed-by: dcherepanov, art --- jdk/src/windows/native/sun/windows/awt_Window.h | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/jdk/src/windows/native/sun/windows/awt_Window.h b/jdk/src/windows/native/sun/windows/awt_Window.h index 1e99c3f84a7..8ad2b0902b2 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.h +++ b/jdk/src/windows/native/sun/windows/awt_Window.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -193,12 +193,17 @@ public: // Execute on Toolkit only. INLINE static LRESULT SynthesizeWmActivate(BOOL doActivate, HWND targetHWnd, HWND oppositeHWnd) { - if (::IsWindowVisible(targetHWnd)) { - return ::SendMessage(targetHWnd, WM_ACTIVATE, - MAKEWPARAM(doActivate ? WA_ACTIVE : WA_INACTIVE, FALSE), - (LPARAM) oppositeHWnd); + if (doActivate && + (!::IsWindowVisible(targetHWnd) || ::IsIconic(::GetAncestor(targetHWnd, GA_ROOT)))) + { + // The activation is rejected if either: + // - The toplevel is not visible + // - The toplevel (or its embedder) is minimised + return 1; } - return 1; // if not processed + return ::SendMessage(targetHWnd, WM_ACTIVATE, + MAKEWPARAM(doActivate ? WA_ACTIVE : WA_INACTIVE, FALSE), + (LPARAM) oppositeHWnd); } void moveToDefaultLocation(); /* moves Window to X,Y specified by Window Manger */ From 2fdbbbae4e3d2dca9b786a506269ee14bde2f6f9 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Fri, 3 Sep 2010 13:11:54 +0100 Subject: [PATCH 037/128] 6965072: Need API to create SDP sockets Reviewed-by: michaelm --- jdk/make/com/Makefile | 2 +- jdk/make/com/oracle/Makefile | 34 +++ jdk/make/com/oracle/net/Makefile | 39 ++++ jdk/make/docs/NON_CORE_PKGS.gmk | 5 +- jdk/make/java/net/FILES_c.gmk | 4 - jdk/make/java/net/Makefile | 5 +- jdk/make/java/net/mapfile-vers | 3 +- jdk/make/java/nio/FILES_java.gmk | 1 + jdk/make/sun/net/FILES_java.gmk | 7 +- jdk/src/share/classes/com/oracle/net/Sdp.java | 201 ++++++++++++++++++ .../share/classes/java/net/SdpSocketImpl.java | 49 +++++ .../share/classes/java/net/ServerSocket.java | 9 + .../share/classes/sun/net/sdp/SdpSupport.java | 81 +++++++ jdk/src/share/classes/sun/nio/ch/Secrets.java | 63 ++++++ .../sun/nio/ch/ServerSocketChannelImpl.java | 9 +- .../classes/sun/nio/ch/SocketChannelImpl.java | 13 ++ jdk/src/solaris/classes/sun/net/NetHooks.java | 29 +-- .../sun/net/{spi => sdp}/SdpProvider.java | 22 +- .../classes/sun/nio/ch/InheritedChannel.java | 2 +- .../{spi/SdpProvider.c => sdp/SdpSupport.c} | 73 +++++-- jdk/test/com/oracle/net/Sanity.java | 142 +++++++++++++ jdk/test/com/oracle/net/sanity.sh | 66 ++++++ jdk/test/sun/net/sdp/ProbeIB.java | 15 +- jdk/test/sun/net/sdp/sanity.sh | 21 +- 24 files changed, 806 insertions(+), 89 deletions(-) create mode 100644 jdk/make/com/oracle/Makefile create mode 100644 jdk/make/com/oracle/net/Makefile create mode 100644 jdk/src/share/classes/com/oracle/net/Sdp.java create mode 100644 jdk/src/share/classes/java/net/SdpSocketImpl.java create mode 100644 jdk/src/share/classes/sun/net/sdp/SdpSupport.java create mode 100644 jdk/src/share/classes/sun/nio/ch/Secrets.java rename jdk/src/solaris/classes/sun/net/{spi => sdp}/SdpProvider.java (95%) rename jdk/src/solaris/native/sun/net/{spi/SdpProvider.c => sdp/SdpSupport.c} (66%) create mode 100644 jdk/test/com/oracle/net/Sanity.java create mode 100644 jdk/test/com/oracle/net/sanity.sh diff --git a/jdk/make/com/Makefile b/jdk/make/com/Makefile index baf56b3ddb0..37472ea3f3a 100644 --- a/jdk/make/com/Makefile +++ b/jdk/make/com/Makefile @@ -31,7 +31,7 @@ BUILDDIR = .. PRODUCT = com include $(BUILDDIR)/common/Defs.gmk -SUBDIRS = sun +SUBDIRS = sun oracle include $(BUILDDIR)/common/Subdirs.gmk all build clean clobber:: diff --git a/jdk/make/com/oracle/Makefile b/jdk/make/com/oracle/Makefile new file mode 100644 index 00000000000..7c70dc78270 --- /dev/null +++ b/jdk/make/com/oracle/Makefile @@ -0,0 +1,34 @@ +# +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +BUILDDIR = ../.. +PRODUCT = oracle +include $(BUILDDIR)/common/Defs.gmk + +SUBDIRS = net +include $(BUILDDIR)/common/Subdirs.gmk + +all build clean clobber:: + $(SUBDIRS-loop) diff --git a/jdk/make/com/oracle/net/Makefile b/jdk/make/com/oracle/net/Makefile new file mode 100644 index 00000000000..5fd30761699 --- /dev/null +++ b/jdk/make/com/oracle/net/Makefile @@ -0,0 +1,39 @@ +# +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +BUILDDIR = ../../.. +PRODUCT = oracle +include $(BUILDDIR)/common/Defs.gmk + +# +# Files to compile +# +AUTO_FILES_JAVA_DIRS = com/oracle/net + +# +# Rules +# +include $(BUILDDIR)/common/Classes.gmk + diff --git a/jdk/make/docs/NON_CORE_PKGS.gmk b/jdk/make/docs/NON_CORE_PKGS.gmk index 6639eecf893..180241483c1 100644 --- a/jdk/make/docs/NON_CORE_PKGS.gmk +++ b/jdk/make/docs/NON_CORE_PKGS.gmk @@ -91,6 +91,8 @@ SCTPAPI_PKGS = com.sun.nio.sctp TRACING_PKGS = com.sun.tracing \ com.sun.tracing.dtrace +ORACLENET_PKGS = com.oracle.net + # non-core packages in rt.jar NON_CORE_PKGS = $(DOMAPI_PKGS) \ $(MGMT_PKGS) \ @@ -101,5 +103,6 @@ NON_CORE_PKGS = $(DOMAPI_PKGS) \ $(HTTPSERVER_PKGS) \ $(SMARTCARDIO_PKGS) \ $(TRACING_PKGS) \ - $(SCTPAPI_PKGS) + $(SCTPAPI_PKGS) \ + $(ORACLENET_PKGS) diff --git a/jdk/make/java/net/FILES_c.gmk b/jdk/make/java/net/FILES_c.gmk index 642244915af..29ce70a6e68 100644 --- a/jdk/make/java/net/FILES_c.gmk +++ b/jdk/make/java/net/FILES_c.gmk @@ -39,10 +39,6 @@ FILES_c = \ ResolverConfigurationImpl.c \ DefaultProxySelector.c -ifeq ($(PLATFORM), solaris) - FILES_c += SdpProvider.c -endif - ifeq ($(PLATFORM), linux) FILES_c += linux_close.c endif diff --git a/jdk/make/java/net/Makefile b/jdk/make/java/net/Makefile index 0021087cbcf..db034f2511e 100644 --- a/jdk/make/java/net/Makefile +++ b/jdk/make/java/net/Makefile @@ -44,6 +44,8 @@ ifeq ($(PLATFORM), windows) endif FILES_c += NTLMAuthSequence.c FILES_c += NetworkInterface_winXP.c +else + FILES_c += SdpSupport.c endif FILES_export = \ @@ -84,7 +86,8 @@ endif # # Find platform specific native code # -vpath %.c $(PLATFORM_SRC)/native/sun/net/dns $(PLATFORM_SRC)/native/sun/net/www/protocol/http/ntlm $(PLATFORM_SRC)/native/sun/net/spi +vpath %.c $(PLATFORM_SRC)/native/sun/net/dns $(PLATFORM_SRC)/native/sun/net/www/protocol/http/ntlm \ + $(PLATFORM_SRC)/native/sun/net/sdp $(PLATFORM_SRC)/native/sun/net/spi # # Include rules diff --git a/jdk/make/java/net/mapfile-vers b/jdk/make/java/net/mapfile-vers index fbcf905d173..0e9a46755d4 100644 --- a/jdk/make/java/net/mapfile-vers +++ b/jdk/make/java/net/mapfile-vers @@ -88,9 +88,10 @@ SUNWprivate_1.1 { Java_java_net_PlainDatagramSocketImpl_setTimeToLive; Java_sun_net_dns_ResolverConfigurationImpl_localDomain0; Java_sun_net_dns_ResolverConfigurationImpl_fallbackDomain0; + Java_sun_net_sdp_SdpSupport_convert0; + Java_sun_net_sdp_SdpSupport_create0; Java_sun_net_spi_DefaultProxySelector_init; Java_sun_net_spi_DefaultProxySelector_getSystemProxy; - Java_sun_net_spi_SdpProvider_convert; NET_AllocSockaddr; NET_SockaddrToInetAddress; NET_SockaddrEqualsInetAddress; diff --git a/jdk/make/java/nio/FILES_java.gmk b/jdk/make/java/nio/FILES_java.gmk index 4ad955d87aa..4d89db04a49 100644 --- a/jdk/make/java/nio/FILES_java.gmk +++ b/jdk/make/java/nio/FILES_java.gmk @@ -199,6 +199,7 @@ FILES_src = \ sun/nio/ch/PipeImpl.java \ sun/nio/ch/PollArrayWrapper.java \ sun/nio/ch/Reflect.java \ + sun/nio/ch/Secrets.java \ sun/nio/ch/SelectionKeyImpl.java \ sun/nio/ch/SelectorImpl.java \ sun/nio/ch/SelectorProviderImpl.java \ diff --git a/jdk/make/sun/net/FILES_java.gmk b/jdk/make/sun/net/FILES_java.gmk index 3eba9b01a17..1fcec35f4e4 100644 --- a/jdk/make/sun/net/FILES_java.gmk +++ b/jdk/make/sun/net/FILES_java.gmk @@ -53,6 +53,7 @@ FILES_java = \ sun/net/ftp/FtpProtocolException.java \ sun/net/ftp/impl/FtpClient.java \ sun/net/ftp/impl/DefaultFtpClientProvider.java \ + sun/net/sdp/SdpSupport.java \ sun/net/spi/DefaultProxySelector.java \ sun/net/spi/nameservice/NameServiceDescriptor.java \ sun/net/spi/nameservice/NameService.java \ @@ -136,8 +137,6 @@ FILES_java = \ ifeq ($(PLATFORM), windows) FILES_java += sun/net/www/protocol/http/ntlm/NTLMAuthSequence.java -endif - -ifeq ($(PLATFORM), solaris) - FILES_java += sun/net/spi/SdpProvider.java +else + FILES_java += sun/net/sdp/SdpProvider.java endif diff --git a/jdk/src/share/classes/com/oracle/net/Sdp.java b/jdk/src/share/classes/com/oracle/net/Sdp.java new file mode 100644 index 00000000000..32316073828 --- /dev/null +++ b/jdk/src/share/classes/com/oracle/net/Sdp.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.net; + +import java.net.Socket; +import java.net.ServerSocket; +import java.net.SocketImpl; +import java.net.SocketImplFactory; +import java.net.SocketException; +import java.nio.channels.SocketChannel; +import java.nio.channels.ServerSocketChannel; +import java.io.IOException; +import java.io.FileDescriptor; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.lang.reflect.Constructor; +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.InvocationTargetException; + +import sun.net.sdp.SdpSupport; + +/** + * This class consists exclusively of static methods that Sockets or Channels to + * sockets that support the InfiniBand Sockets Direct Protocol (SDP). + */ + +public final class Sdp { + private Sdp() { } + + /** + * The package-privage ServerSocket(SocketImpl) constructor + */ + private static final Constructor serverSocketCtor; + static { + try { + serverSocketCtor = (Constructor) + ServerSocket.class.getDeclaredConstructor(SocketImpl.class); + setAccessible(serverSocketCtor); + } catch (NoSuchMethodException e) { + throw new AssertionError(e); + } + } + + /** + * The package-private SdpSocketImpl() constructor + */ + private static final Constructor socketImplCtor; + static { + try { + Class cl = Class.forName("java.net.SdpSocketImpl", true, null); + socketImplCtor = (Constructor)cl.getDeclaredConstructor(); + setAccessible(socketImplCtor); + } catch (ClassNotFoundException e) { + throw new AssertionError(e); + } catch (NoSuchMethodException e) { + throw new AssertionError(e); + } + } + + private static void setAccessible(final AccessibleObject o) { + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + o.setAccessible(true); + return null; + } + }); + } + + /** + * SDP enabled Socket. + */ + private static class SdpSocket extends Socket { + SdpSocket(SocketImpl impl) throws SocketException { + super(impl); + } + } + + /** + * Creates a SDP enabled SocketImpl + */ + private static SocketImpl createSocketImpl() { + try { + return socketImplCtor.newInstance(); + } catch (InstantiationException x) { + throw new AssertionError(x); + } catch (IllegalAccessException x) { + throw new AssertionError(x); + } catch (InvocationTargetException x) { + throw new AssertionError(x); + } + } + + /** + * Creates an unconnected and unbound SDP socket. The {@code Socket} is + * associated with a {@link java.net.SocketImpl} of the system-default type. + * + * @return a new Socket + * + * @throws UnsupportedOperationException + * If SDP is not supported + * @throws IOException + * If an I/O error occurs + */ + public static Socket openSocket() throws IOException { + SocketImpl impl = createSocketImpl(); + return new SdpSocket(impl); + } + + /** + * Creates an unbound SDP server socket. The {@code ServerSocket} is + * associated with a {@link java.net.SocketImpl} of the system-default type. + * + * @return a new ServerSocket + * + * @throws UnsupportedOperationException + * If SDP is not supported + * @throws IOException + * If an I/O error occurs + */ + public static ServerSocket openServerSocket() throws IOException { + // create ServerSocket via package-private constructor + SocketImpl impl = createSocketImpl(); + try { + return serverSocketCtor.newInstance(impl); + } catch (IllegalAccessException x) { + throw new AssertionError(x); + } catch (InstantiationException x) { + throw new AssertionError(x); + } catch (InvocationTargetException x) { + Throwable cause = x.getCause(); + if (cause instanceof IOException) + throw (IOException)cause; + if (cause instanceof RuntimeException) + throw (RuntimeException)cause; + throw new RuntimeException(x); + } + } + + /** + * Opens a socket channel to a SDP socket. + * + *

    The channel will be associated with the system-wide default + * {@link java.nio.channels.spi.SelectorProvider SelectorProvider}. + * + * @return a new SocketChannel + * + * @throws UnsupportedOperationException + * If SDP is not supported or not supported by the default selector + * provider + * @throws IOException + * If an I/O error occurs. + */ + public static SocketChannel openSocketChannel() throws IOException { + FileDescriptor fd = SdpSupport.createSocket(); + return sun.nio.ch.Secrets.newSocketChannel(fd); + } + + /** + * Opens a socket channel to a SDP socket. + * + *

    The channel will be associated with the system-wide default + * {@link java.nio.channels.spi.SelectorProvider SelectorProvider}. + * + * @return a new ServerSocketChannel + * + * @throws UnsupportedOperationException + * If SDP is not supported or not supported by the default selector + * provider + * @throws IOException + * If an I/O error occurs + */ + public static ServerSocketChannel openServerSocketChannel() + throws IOException + { + FileDescriptor fd = SdpSupport.createSocket(); + return sun.nio.ch.Secrets.newServerSocketChannel(fd); + } +} diff --git a/jdk/src/share/classes/java/net/SdpSocketImpl.java b/jdk/src/share/classes/java/net/SdpSocketImpl.java new file mode 100644 index 00000000000..b5b023e2433 --- /dev/null +++ b/jdk/src/share/classes/java/net/SdpSocketImpl.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.net; + +import java.io.IOException; +import java.io.FileDescriptor; + +import sun.net.sdp.SdpSupport; + +/** + * SocketImpl that supports the SDP protocol + */ +class SdpSocketImpl extends PlainSocketImpl { + SdpSocketImpl() { } + + @Override + protected void create(boolean stream) throws IOException { + if (!stream) + throw new UnsupportedOperationException("Must be a stream socket"); + fd = SdpSupport.createSocket(); + if (socket != null) + socket.setCreated(); + if (serverSocket != null) + serverSocket.setCreated(); + } +} diff --git a/jdk/src/share/classes/java/net/ServerSocket.java b/jdk/src/share/classes/java/net/ServerSocket.java index 8189d8aa4f0..d4b44e4ccb2 100644 --- a/jdk/src/share/classes/java/net/ServerSocket.java +++ b/jdk/src/share/classes/java/net/ServerSocket.java @@ -68,6 +68,15 @@ class ServerSocket implements java.io.Closeable { */ private boolean oldImpl = false; + /** + * Package-private constructor to create a ServerSocket associated with + * the given SocketImpl. + */ + ServerSocket(SocketImpl impl) { + this.impl = impl; + impl.setServerSocket(this); + } + /** * Creates an unbound server socket. * diff --git a/jdk/src/share/classes/sun/net/sdp/SdpSupport.java b/jdk/src/share/classes/sun/net/sdp/SdpSupport.java new file mode 100644 index 00000000000..5baca6e4925 --- /dev/null +++ b/jdk/src/share/classes/sun/net/sdp/SdpSupport.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.net.sdp; + +import java.io.IOException; +import java.io.FileDescriptor; +import java.security.AccessController; + +import sun.misc.SharedSecrets; +import sun.misc.JavaIOFileDescriptorAccess; + + +/** + * This class defines methods for creating SDP sockets or "converting" existing + * file descriptors, referencing (unbound) TCP sockets, to SDP. + */ + +public final class SdpSupport { + private static final String os = AccessController + .doPrivileged(new sun.security.action.GetPropertyAction("os.name")); + private static final boolean isSupported = (os.equals("SunOS") || (os.equals("Linux"))); + private static final JavaIOFileDescriptorAccess fdAccess = + SharedSecrets.getJavaIOFileDescriptorAccess(); + + private SdpSupport() { } + + /** + * Creates a SDP socket, returning file descriptor referencing the socket. + */ + public static FileDescriptor createSocket() throws IOException { + if (!isSupported) + throw new UnsupportedOperationException("SDP not supported on this platform"); + int fdVal = create0(); + FileDescriptor fd = new FileDescriptor(); + fdAccess.set(fd, fdVal); + return fd; + } + + /** + * Converts an existing file descriptor, that references an unbound TCP socket, + * to SDP. + */ + public static void convertSocket(FileDescriptor fd) throws IOException { + if (!isSupported) + throw new UnsupportedOperationException("SDP not supported on this platform"); + int fdVal = fdAccess.get(fd); + convert0(fdVal); + } + + private static native int create0() throws IOException; + + private static native void convert0(int fd) throws IOException; + + static { + AccessController.doPrivileged( + new sun.security.action.LoadLibraryAction("net")); + } +} diff --git a/jdk/src/share/classes/sun/nio/ch/Secrets.java b/jdk/src/share/classes/sun/nio/ch/Secrets.java new file mode 100644 index 00000000000..f76ab1d75a0 --- /dev/null +++ b/jdk/src/share/classes/sun/nio/ch/Secrets.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.nio.ch; + +import java.nio.channels.SocketChannel; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.spi.SelectorProvider; +import java.io.FileDescriptor; +import java.io.IOException; + +/** + * Provides access to implementation private constructors and methods. + */ + +public final class Secrets { + private Secrets() { } + + private static SelectorProvider provider() { + SelectorProvider p = SelectorProvider.provider(); + if (!(p instanceof SelectorProviderImpl)) + throw new UnsupportedOperationException(); + return p; + } + + public static SocketChannel newSocketChannel(FileDescriptor fd) { + try { + return new SocketChannelImpl(provider(), fd, false); + } catch (IOException ioe) { + throw new AssertionError(ioe); + } + } + + public static ServerSocketChannel newServerSocketChannel(FileDescriptor fd) { + try { + return new ServerSocketChannelImpl(provider(), fd, false); + } catch (IOException ioe) { + throw new AssertionError(ioe); + } + } +} diff --git a/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java index 8df9ae4ca4a..3685d3a7c68 100644 --- a/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java @@ -80,21 +80,24 @@ class ServerSocketChannelImpl // -- End of fields protected by stateLock - public ServerSocketChannelImpl(SelectorProvider sp) throws IOException { + ServerSocketChannelImpl(SelectorProvider sp) throws IOException { super(sp); this.fd = Net.serverSocket(true); this.fdVal = IOUtil.fdVal(fd); this.state = ST_INUSE; } - public ServerSocketChannelImpl(SelectorProvider sp, FileDescriptor fd) + ServerSocketChannelImpl(SelectorProvider sp, + FileDescriptor fd, + boolean bound) throws IOException { super(sp); this.fd = fd; this.fdVal = IOUtil.fdVal(fd); this.state = ST_INUSE; - localAddress = Net.localAddress(fd); + if (bound) + localAddress = Net.localAddress(fd); } public ServerSocket socket() { diff --git a/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java index 7d42d7d0096..c8b93b7c6f7 100644 --- a/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java @@ -103,6 +103,19 @@ class SocketChannelImpl this.state = ST_UNCONNECTED; } + SocketChannelImpl(SelectorProvider sp, + FileDescriptor fd, + boolean bound) + throws IOException + { + super(sp); + this.fd = fd; + this.fdVal = IOUtil.fdVal(fd); + this.state = ST_UNCONNECTED; + if (bound) + this.localAddress = Net.localAddress(fd); + } + // Constructor for sockets obtained from server sockets // SocketChannelImpl(SelectorProvider sp, diff --git a/jdk/src/solaris/classes/sun/net/NetHooks.java b/jdk/src/solaris/classes/sun/net/NetHooks.java index 06a11e54264..bc4a60b72eb 100644 --- a/jdk/src/solaris/classes/sun/net/NetHooks.java +++ b/jdk/src/solaris/classes/sun/net/NetHooks.java @@ -73,28 +73,7 @@ public final class NetHooks { * be changed to use the ServiceLoader facility to allow the deployment of * other providers. */ - private static Provider loadProvider(final String cn) { - return AccessController - .doPrivileged(new PrivilegedAction() { - @Override public Provider run() { - Class c; - try { - c = (Class)Class.forName(cn, true, null); - } catch (ClassNotFoundException x) { - return null; - } - try { - return c.newInstance(); - } catch (IllegalAccessException x) { - throw new AssertionError(x); - } catch (InstantiationException x) { - throw new AssertionError(x); - } - }}); - } - private static final Provider provider = AccessController - .doPrivileged(new GetPropertyAction("os.name")).equals("SunOS") ? - loadProvider("sun.net.spi.SdpProvider") : null; + private static final Provider provider = new sun.net.sdp.SdpProvider(); /** * Invoke prior to binding a TCP socket. @@ -104,8 +83,7 @@ public final class NetHooks { int port) throws IOException { - if (provider != null) - provider.implBeforeTcpBind(fdObj, address, port); + provider.implBeforeTcpBind(fdObj, address, port); } /** @@ -116,7 +94,6 @@ public final class NetHooks { int port) throws IOException { - if (provider != null) - provider.implBeforeTcpConnect(fdObj, address, port); + provider.implBeforeTcpConnect(fdObj, address, port); } } diff --git a/jdk/src/solaris/classes/sun/net/spi/SdpProvider.java b/jdk/src/solaris/classes/sun/net/sdp/SdpProvider.java similarity index 95% rename from jdk/src/solaris/classes/sun/net/spi/SdpProvider.java rename to jdk/src/solaris/classes/sun/net/sdp/SdpProvider.java index b2e7a0f591b..0fcec598726 100644 --- a/jdk/src/solaris/classes/sun/net/spi/SdpProvider.java +++ b/jdk/src/solaris/classes/sun/net/sdp/SdpProvider.java @@ -23,7 +23,7 @@ * questions. */ -package sun.net.spi; +package sun.net.sdp; import sun.net.NetHooks; import java.net.InetAddress; @@ -34,9 +34,10 @@ import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintStream; +import java.security.AccessController; -import sun.misc.SharedSecrets; -import sun.misc.JavaIOFileDescriptorAccess; +import sun.net.sdp.SdpSupport; +import sun.security.action.GetPropertyAction; /** * A NetHooks provider that converts sockets from the TCP to SDP protocol prior @@ -44,9 +45,6 @@ import sun.misc.JavaIOFileDescriptorAccess; */ public class SdpProvider extends NetHooks.Provider { - private static final JavaIOFileDescriptorAccess fdAccess = - SharedSecrets.getJavaIOFileDescriptorAccess(); - // maximum port private static final int MAX_PORT = 65535; @@ -59,7 +57,8 @@ public class SdpProvider extends NetHooks.Provider { public SdpProvider() { // if this property is not defined then there is nothing to do. - String file = System.getProperty("com.sun.sdp.conf"); + String file = AccessController.doPrivileged( + new GetPropertyAction("com.sun.sdp.conf")); if (file == null) { this.enabled = false; this.rules = null; @@ -78,7 +77,8 @@ public class SdpProvider extends NetHooks.Provider { // check if debugging is enabled PrintStream out = null; - String logfile = System.getProperty("com.sun.sdp.debug"); + String logfile = AccessController.doPrivileged( + new GetPropertyAction("com.sun.sdp.debug")); if (logfile != null) { out = System.out; if (logfile.length() > 0) { @@ -297,8 +297,7 @@ public class SdpProvider extends NetHooks.Provider { boolean matched = false; for (Rule rule: rules) { if (rule.match(action, address, port)) { - int fd = fdAccess.get(fdObj); - convert(fd); + SdpSupport.convertSocket(fdObj); matched = true; break; } @@ -333,7 +332,4 @@ public class SdpProvider extends NetHooks.Provider { if (enabled) convertTcpToSdpIfMatch(fdObj, Action.CONNECT, address, port); } - - // -- native methods -- - private static native void convert(int fd) throws IOException; } diff --git a/jdk/src/solaris/classes/sun/nio/ch/InheritedChannel.java b/jdk/src/solaris/classes/sun/nio/ch/InheritedChannel.java index a834f6f31df..ff51aa052ca 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/InheritedChannel.java +++ b/jdk/src/solaris/classes/sun/nio/ch/InheritedChannel.java @@ -96,7 +96,7 @@ class InheritedChannel { FileDescriptor fd) throws IOException { - super(sp, fd); + super(sp, fd, true); } protected void implCloseSelectableChannel() throws IOException { diff --git a/jdk/src/solaris/native/sun/net/spi/SdpProvider.c b/jdk/src/solaris/native/sun/net/sdp/SdpSupport.c similarity index 66% rename from jdk/src/solaris/native/sun/net/spi/SdpProvider.c rename to jdk/src/solaris/native/sun/net/sdp/SdpSupport.c index 5b927404606..dd2750be5f7 100644 --- a/jdk/src/solaris/native/sun/net/spi/SdpProvider.c +++ b/jdk/src/solaris/native/sun/net/sdp/SdpSupport.c @@ -25,9 +25,16 @@ #include #include +#include -#if defined(__solaris__) && !defined(PROTO_SDP) -#define PROTO_SDP 257 +#if defined(__solaris__) + #if !defined(PROTO_SDP) + #define PROTO_SDP 257 + #endif +#elif defined(__linux__) + #if !defined(AF_INET_SDP) + #define AF_INET_SDP 27 + #endif #endif #include "jni.h" @@ -40,20 +47,61 @@ } while((_result == -1) && (errno == EINTR)); \ } while(0) -JNIEXPORT void JNICALL -Java_sun_net_spi_SdpProvider_convert(JNIEnv *env, jclass cls, jint fd) + +/** + * Creates a SDP socket. + */ +static int create(JNIEnv* env) { -#ifdef PROTO_SDP -#ifdef AF_INET6 + int s; + +#if defined(__solaris__) + #ifdef AF_INET6 int domain = ipv6_available() ? AF_INET6 : AF_INET; -#else + #else int domain = AF_INET; + #endif + s = socket(domain, SOCK_STREAM, PROTO_SDP); +#elif defined(__linux__) + /** + * IPv6 not supported by SDP on Linux + */ + if (ipv6_available()) { + JNU_ThrowIOException(env, "IPv6 not supported"); + return; + } + s = socket(AF_INET_SDP, SOCK_STREAM, 0); +#else + /* not supported on other platforms at this time */ + s = -1; + errno = EPROTONOSUPPORT; #endif - int s = socket(domain, SOCK_STREAM, PROTO_SDP); - if (s < 0) { + + if (s < 0) JNU_ThrowIOExceptionWithLastError(env, "socket"); - } else { - int arg, len, res; + return s; +} + +/** + * Creates a SDP socket, returning file descriptor referencing the socket. + */ +JNIEXPORT jint JNICALL +Java_sun_net_sdp_SdpSupport_create0(JNIEnv *env, jclass cls) +{ + return create(env); +} + +/** + * Converts an existing file descriptor, that references an unbound TCP socket, + * to SDP. + */ +JNIEXPORT void JNICALL +Java_sun_net_sdp_SdpSupport_convert0(JNIEnv *env, jclass cls, int fd) +{ + int s = create(env); + if (s >= 0) { + socklen_t len; + int arg, res; struct linger linger; /* copy socket options that are relevant to SDP */ @@ -72,7 +120,4 @@ Java_sun_net_spi_SdpProvider_convert(JNIEnv *env, jclass cls, jint fd) JNU_ThrowIOExceptionWithLastError(env, "dup2"); RESTARTABLE(close(s), res); } -#else - JNU_ThrowInternalError(env, "should not reach here"); -#endif } diff --git a/jdk/test/com/oracle/net/Sanity.java b/jdk/test/com/oracle/net/Sanity.java new file mode 100644 index 00000000000..c4c97152779 --- /dev/null +++ b/jdk/test/com/oracle/net/Sanity.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import com.oracle.net.Sdp; + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.*; + +/** + * Exercise com.oracle.net.Sdp with each IP address plumbed to InfiniBand + * interfaces listed in a given file. + */ + +public class Sanity { + public static void main(String[] args) throws Exception { + // The file is a list of interfaces to test. + Scanner s = new Scanner(new File(args[0])); + try { + while (s.hasNextLine()) { + String link = s.nextLine(); + NetworkInterface ni = NetworkInterface.getByName(link); + if (ni != null) { + Enumeration addrs = ni.getInetAddresses(); + while (addrs.hasMoreElements()) { + InetAddress addr = addrs.nextElement(); + System.out.format("Testing %s: %s\n", link, addr.getHostAddress()); + test(addr); + } + } + } + } finally { + s.close(); + } + } + + static void test(InetAddress addr) throws Exception { + // Test SocketChannel and ServerSocketChannel + ServerSocketChannel ssc = Sdp.openServerSocketChannel(); + try { + ssc.socket().bind(new InetSocketAddress(addr, 0)); + int port = ssc.socket().getLocalPort(); + + // SocketChannel.connect (implicit bind) + SocketChannel client = Sdp.openSocketChannel(); + try { + client.connect(new InetSocketAddress(addr, port)); + SocketChannel peer = ssc.accept(); + try { + testConnection(Channels.newOutputStream(client), + Channels.newInputStream(peer)); + } finally { + peer.close(); + } + } finally { + client.close(); + } + + // SocketChannel.connect (explicit bind) + client = Sdp.openSocketChannel(); + try { + client.socket().bind(new InetSocketAddress(addr, 0)); + client.connect(new InetSocketAddress(addr, port)); + ssc.accept().close(); + } finally { + client.close(); + } + } finally { + ssc.close(); + } + + // Test Socket and ServerSocket + ServerSocket ss = Sdp.openServerSocket(); + try { + ss.bind(new InetSocketAddress(addr, 0)); + int port = ss.getLocalPort(); + + // Socket.connect (implicit bind) + Socket s = Sdp.openSocket(); + try { + s.connect(new InetSocketAddress(addr, port)); + Socket peer = ss.accept(); + try { + testConnection(s.getOutputStream(), peer.getInputStream()); + } finally { + peer.close(); + } + } finally { + s.close(); + } + + // Socket.connect (explicit bind) + s = Sdp.openSocket(); + try { + s.bind(new InetSocketAddress(addr, 0)); + s.connect(new InetSocketAddress(addr, port)); + ss.accept().close(); + } finally { + s.close(); + } + } finally { + ss.close(); + } + } + + static void testConnection(OutputStream out, InputStream in) + throws IOException + { + byte[] msg = "hello".getBytes(); + out.write(msg); + + byte[] ba = new byte[100]; + int nread = 0; + while (nread < msg.length) { + int n = in.read(ba); + if (n < 0) + throw new IOException("EOF not expected!"); + nread += n; + } + } +} diff --git a/jdk/test/com/oracle/net/sanity.sh b/jdk/test/com/oracle/net/sanity.sh new file mode 100644 index 00000000000..b54d866b4fa --- /dev/null +++ b/jdk/test/com/oracle/net/sanity.sh @@ -0,0 +1,66 @@ +# +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 6965072 +# @summary Unit test for SDP support +# @build Sanity +# @run shell sanity.sh + +IB_LINKS=ib.links + +OS=`uname -s` +case "$OS" in + SunOS ) + /usr/sbin/dladm show-part -o LINK -p > ${IB_LINKS} + if [ $? != 0 ]; then + echo "Unable to get InfiniBand parition link information" + exit 0 + fi + ;; + Linux ) + if [ ! -f /proc/net/sdp ]; then + echo "InfiniBand SDP module not installed" + exit 0 + fi + egrep "^[ \t]+ib" /proc/net/dev|cut -d':' -f1|tr -d '\t ' > ${IB_LINKS} + ;; + * ) + echo "This test only runs on Solaris or Linux" + exit 0 + ;; +esac + +if [ -z "$TESTJAVA" ]; then + JAVA=java + TESTCLASSES=. + TESTSRC=. +else + JAVA="${TESTJAVA}/bin/java" +fi + +CLASSPATH=${TESTCLASSES}:${TESTSRC} +export CLASSPATH + +# Run sanity test (IPv4-only for now) +$JAVA -Djava.net.preferIPv4Stack=true Sanity ${IB_LINKS} diff --git a/jdk/test/sun/net/sdp/ProbeIB.java b/jdk/test/sun/net/sdp/ProbeIB.java index 34244b84b0d..0f1535fce14 100644 --- a/jdk/test/sun/net/sdp/ProbeIB.java +++ b/jdk/test/sun/net/sdp/ProbeIB.java @@ -34,21 +34,16 @@ import java.util.Enumeration; public class ProbeIB { public static void main(String[] args) throws IOException { - Scanner s = new Scanner(new File("/etc/path_to_inst")); + Scanner s = new Scanner(new File(args[0])); try { while (s.hasNextLine()) { - String line = s.nextLine(); - if (line.startsWith("#")) - continue; - String[] fields = line.split("\\s+"); - if (!fields[2].equals("\"ibd\"")) - continue; - String name = fields[2].substring(1, fields[2].length()-1) + fields[1]; - NetworkInterface ni = NetworkInterface.getByName(name); + String link = s.nextLine(); + NetworkInterface ni = NetworkInterface.getByName(link); if (ni != null) { Enumeration addrs = ni.getInetAddresses(); while (addrs.hasMoreElements()) { - System.out.println(addrs.nextElement().getHostAddress()); + InetAddress addr = addrs.nextElement(); + System.out.println(addr.getHostAddress()); } } } diff --git a/jdk/test/sun/net/sdp/sanity.sh b/jdk/test/sun/net/sdp/sanity.sh index e1a209ba347..f35425b46f2 100644 --- a/jdk/test/sun/net/sdp/sanity.sh +++ b/jdk/test/sun/net/sdp/sanity.sh @@ -33,14 +33,15 @@ if [ "$OS" != "SunOS" ]; then echo "This is a Solaris-only test" exit 0 fi -SDPADM=/usr/sbin/sdpadm -if [ ! -f ${SDPADM} ]; then - echo "SDP not available" - exit 0 -fi -${SDPADM} status|grep Enabled -if [ $? != 0 ]; then - echo "SDP not enabled" + +IB_LINKS=ib.links +IB_ADDRS=ib.addrs + +# Display IB partition link information +# (requires Solaris 11, will fail on Solaris 10) +/usr/sbin/dladm show-part -o LINK -p > ${IB_LINKS} +if [ $? != 0 ]; then + echo "Unable to get IB parition link information" exit 0 fi @@ -56,13 +57,13 @@ CLASSPATH=${TESTCLASSES}:${TESTSRC} export CLASSPATH # Probe for IP addresses plumbed to IB interfaces -$JAVA -Djava.net.preferIPv4Stack=true ProbeIB > ib_addrs +$JAVA -Djava.net.preferIPv4Stack=true ProbeIB ${IB_LINKS} > ${IB_ADDRS} # Create sdp.conf SDPCONF=sdp.conf rm ${SDPCONF} touch ${SDPCONF} -cat ib_addrs | while read ADDR +cat ${IB_ADDRS} | while read ADDR do echo "bind ${ADDR} *" > ${SDPCONF} echo "connect ${ADDR} *" >> ${SDPCONF} From ef7b8cbc9eae35bc35625de155b41d4fe794c038 Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Fri, 3 Sep 2010 07:59:21 -0700 Subject: [PATCH 038/128] 6981001: (launcher) EnsureJREInstallation is not being called in order Reviewed-by: darcy --- jdk/src/windows/bin/java_md.c | 7 +-- .../{VerifyExceptions.java => MiscTests.java} | 43 +++++++++++++++---- 2 files changed, 38 insertions(+), 12 deletions(-) rename jdk/test/tools/launcher/{VerifyExceptions.java => MiscTests.java} (60%) diff --git a/jdk/src/windows/bin/java_md.c b/jdk/src/windows/bin/java_md.c index 62cc3006005..abd887c94d5 100644 --- a/jdk/src/windows/bin/java_md.c +++ b/jdk/src/windows/bin/java_md.c @@ -105,15 +105,15 @@ CreateExecutionEnvironment(int *pargc, char ***pargv, exit(1); } - /* Do this before we read jvm.cfg */ - EnsureJreInstallation(jrepath); - /* Find out where the JRE is that we will be using. */ if (!GetJREPath(jrepath, so_jrepath)) { JLI_ReportErrorMessage(JRE_ERROR1); exit(2); } + /* Do this before we read jvm.cfg and after jrepath is initialized */ + EnsureJreInstallation(jrepath); + /* Find the specified JVM type */ if (ReadKnownVMs(jrepath, (char*)GetArch(), JNI_FALSE) < 1) { JLI_ReportErrorMessage(CFG_ERROR7); @@ -213,6 +213,7 @@ EnsureJreInstallation(const char* jrepath) } /* Does our bundle directory exist ? */ JLI_Snprintf(tmpbuf, sizeof(tmpbuf), "%s\\lib\\bundles", jrepath); + JLI_TraceLauncher("EnsureJreInstallation: %s\n", tmpbuf); if (stat(tmpbuf, &s) != 0) { return; } diff --git a/jdk/test/tools/launcher/VerifyExceptions.java b/jdk/test/tools/launcher/MiscTests.java similarity index 60% rename from jdk/test/tools/launcher/VerifyExceptions.java rename to jdk/test/tools/launcher/MiscTests.java index 166ffff9b1b..654a56a01f4 100644 --- a/jdk/test/tools/launcher/VerifyExceptions.java +++ b/jdk/test/tools/launcher/MiscTests.java @@ -23,19 +23,22 @@ /* * @test - * @bug 6856415 - * @summary Checks to ensure that proper exceptions are thrown by java - * @compile -XDignore.symbol.file VerifyExceptions.java TestHelper.java - * @run main VerifyExceptions + * @bug 6856415 6981001 + * @summary Miscellaneous tests, Exceptions, EnsureJRE etc. + * @compile -XDignore.symbol.file MiscTests.java TestHelper.java + * @run main MiscTests */ import java.io.File; import java.io.FileNotFoundException; +import java.util.HashMap; +import java.util.Map; -public class VerifyExceptions { +public class MiscTests { + // 6856415: Checks to ensure that proper exceptions are thrown by java static void test6856415() { // No pkcs library on win-x64, so we bail out. if (TestHelper.is64Bit && TestHelper.isWindows) { @@ -53,13 +56,35 @@ public class VerifyExceptions { } catch (FileNotFoundException fnfe) { throw new RuntimeException(fnfe); } - TestHelper.TestResult tr = TestHelper.doExec(TestHelper.javacCmd, + TestHelper.TestResult tr = TestHelper.doExec(TestHelper.javaCmd, "-Djava.security.manager", "-jar", testJar.getName(), "foo.bak"); - tr.checkNegative(); - tr.contains("Exception in thread \"main\" java.security.AccessControlException: access denied (\"java.lang.RuntimePermission\" \"accessClassInPackage.sun.security.pkcs11\")\")"); + for (String s : tr.testOutput) { + System.out.println(s); + } + if (!tr.contains("java.security.AccessControlException:" + + " access denied (\"java.lang.RuntimePermission\"" + + " \"accessClassInPackage.sun.security.pkcs11\")")) { + System.out.println(tr.status); + } + } + // 6981001 : Check EnsureJreInstallation is ok, note we cannot + // thoroughly test this function, we simply do our best. + static void test6981001() { + if (TestHelper.is64Bit || !TestHelper.isWindows) { + return; + } + Map env = new HashMap(); + env.put("_JAVA_LAUNCHER_DEBUG", "true"); + TestHelper.TestResult tr = TestHelper.doExec(env, TestHelper.javaCmd); + if (!tr.contains(TestHelper.JAVAHOME + "\\lib\\bundles")) { + System.out.println(tr.status); + } } - public static void main(String... args) { test6856415(); + test6981001(); + if (TestHelper.testExitValue != 0) { + throw new Error(TestHelper.testExitValue + " tests failed"); } } +} From 7d47787007fbe6b258338547d7bd9c663a4ee03d Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Fri, 3 Sep 2010 15:00:10 -0700 Subject: [PATCH 039/128] 4881419: The type of X[].clone() should be X[] Reviewed-by: martin --- jdk/src/share/classes/java/lang/Object.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/classes/java/lang/Object.java b/jdk/src/share/classes/java/lang/Object.java index 2e1011a60da..c730db44e23 100644 --- a/jdk/src/share/classes/java/lang/Object.java +++ b/jdk/src/share/classes/java/lang/Object.java @@ -189,7 +189,9 @@ public class Object { * specific cloning operation. First, if the class of this object does * not implement the interface {@code Cloneable}, then a * {@code CloneNotSupportedException} is thrown. Note that all arrays - * are considered to implement the interface {@code Cloneable}. + * are considered to implement the interface {@code Cloneable} and that + * the return type of the {@code clone} method of an array type {@code T[]} + * is {@code T[]} where T is any reference or primitive type. * Otherwise, this method creates a new instance of the class of this * object and initializes all its fields with exactly the contents of * the corresponding fields of this object, as if by assignment; the From a239e8e46209f684a2b88170e1cf9db9f7d99941 Mon Sep 17 00:00:00 2001 From: Lance Andersen Date: Sat, 4 Sep 2010 12:21:56 -0400 Subject: [PATCH 040/128] 6861385: Updated SQLException subclasses to clarify that they may be thrown for vendor specific conditions Reviewed-by: alanb --- .../share/classes/java/sql/SQLDataException.java | 13 ++++++++----- .../SQLIntegrityConstraintViolationException.java | 10 +++++++--- .../sql/SQLInvalidAuthorizationSpecException.java | 12 ++++++++---- .../sql/SQLNonTransientConnectionException.java | 10 ++++++---- .../classes/java/sql/SQLSyntaxErrorException.java | 9 ++++++--- .../java/sql/SQLTransactionRollbackException.java | 13 ++++++++----- .../java/sql/SQLTransientConnectionException.java | 11 ++++++----- 7 files changed, 49 insertions(+), 29 deletions(-) diff --git a/jdk/src/share/classes/java/sql/SQLDataException.java b/jdk/src/share/classes/java/sql/SQLDataException.java index 813b9949782..add946bec4b 100644 --- a/jdk/src/share/classes/java/sql/SQLDataException.java +++ b/jdk/src/share/classes/java/sql/SQLDataException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2006, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,13 @@ package java.sql; /** - * The subclass of {@link SQLException} thrown when the SQLState class value is '22'. This indicates - * various data errors, including but not limited to not-allowed conversion, division by 0 - * and invalid arguments to functions. - * + * The subclass of {@link SQLException} thrown when the SQLState class value + * is '22', or under vendor-specified conditions. This indicates + * various data errors, including but not limited to data conversion errors, + * division by 0, and invalid arguments to functions. + *

    + * Please consult your driver vendor documentation for the vendor-specified + * conditions for which this Exception may be thrown. * @since 1.6 */ public class SQLDataException extends SQLNonTransientException { diff --git a/jdk/src/share/classes/java/sql/SQLIntegrityConstraintViolationException.java b/jdk/src/share/classes/java/sql/SQLIntegrityConstraintViolationException.java index 0c7160d2675..6bbef40696a 100644 --- a/jdk/src/share/classes/java/sql/SQLIntegrityConstraintViolationException.java +++ b/jdk/src/share/classes/java/sql/SQLIntegrityConstraintViolationException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2006, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,13 @@ package java.sql; /** - * The subclass of {@link SQLException} thrown when the SQLState class value is '23'. This indicates that an integrity + * The subclass of {@link SQLException} thrown when the SQLState class value + * is '23', or under vendor-specified conditions. + * This indicates that an integrity * constraint (foreign key, primary key or unique key) has been violated. - * + *

    + * Please consult your driver vendor documentation for the vendor-specified + * conditions for which this Exception may be thrown. * @since 1.6 */ public class SQLIntegrityConstraintViolationException extends SQLNonTransientException { diff --git a/jdk/src/share/classes/java/sql/SQLInvalidAuthorizationSpecException.java b/jdk/src/share/classes/java/sql/SQLInvalidAuthorizationSpecException.java index 34ccfe13301..c1a029be878 100644 --- a/jdk/src/share/classes/java/sql/SQLInvalidAuthorizationSpecException.java +++ b/jdk/src/share/classes/java/sql/SQLInvalidAuthorizationSpecException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2006, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,13 @@ package java.sql; /** - * The subclass of {@link SQLException} thrown when the SQLState class value is '28'. This indicated that the - * authorization credentials presented during connection establishment are not valid. - * + * The subclass of {@link SQLException} thrown when the SQLState class value + * is '28', or under vendor-specified conditions. This indicates that + * the authorization credentials presented during connection establishment + * are not valid. + *

    + * Please consult your driver vendor documentation for the vendor-specified + * conditions for which this Exception may be thrown. * @since 1.6 */ public class SQLInvalidAuthorizationSpecException extends SQLNonTransientException { diff --git a/jdk/src/share/classes/java/sql/SQLNonTransientConnectionException.java b/jdk/src/share/classes/java/sql/SQLNonTransientConnectionException.java index 089f7f439ed..9ba550fa3ce 100644 --- a/jdk/src/share/classes/java/sql/SQLNonTransientConnectionException.java +++ b/jdk/src/share/classes/java/sql/SQLNonTransientConnectionException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2006, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,11 +26,13 @@ package java.sql; /** - *

    The subclass of {@link SQLException} thrown for the SQLState - * class value '08', representing - * that the connection operation that failed will not succeed when + * The subclass of {@link SQLException} thrown for the SQLState + * class value '08', or under vendor-specified conditions. This + * indicates that the connection operation that failed will not succeed if * the operation is retried without the cause of the failure being corrected. *

    + * Please consult your driver vendor documentation for the vendor-specified + * conditions for which this Exception may be thrown. * @since 1.6 */ public class SQLNonTransientConnectionException extends java.sql.SQLNonTransientException { diff --git a/jdk/src/share/classes/java/sql/SQLSyntaxErrorException.java b/jdk/src/share/classes/java/sql/SQLSyntaxErrorException.java index a1865d93bbb..b50de575943 100644 --- a/jdk/src/share/classes/java/sql/SQLSyntaxErrorException.java +++ b/jdk/src/share/classes/java/sql/SQLSyntaxErrorException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2006, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,12 @@ package java.sql; /** - * The subclass of {@link SQLException} thrown when the SQLState class value is '42'. This indicates that the + * The subclass of {@link SQLException} thrown when the SQLState class value + * is '42', or under vendor-specified conditions. This indicates that the * in-progress query has violated SQL syntax rules. - * + *

    + * Please consult your driver vendor documentation for the vendor-specified + * conditions for which this Exception may be thrown. * @since 1.6 */ public class SQLSyntaxErrorException extends SQLNonTransientException { diff --git a/jdk/src/share/classes/java/sql/SQLTransactionRollbackException.java b/jdk/src/share/classes/java/sql/SQLTransactionRollbackException.java index 9e05add35ad..38ced61e3e3 100644 --- a/jdk/src/share/classes/java/sql/SQLTransactionRollbackException.java +++ b/jdk/src/share/classes/java/sql/SQLTransactionRollbackException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2006, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,13 @@ package java.sql; /** - * The subclass of {@link SQLException} thrown when the SQLState class value is '40'. This indicates that the - * current statement was automatically rolled back by the database becuase of deadlock or other - * transaction serialization failures. - * + * The subclass of {@link SQLException} thrown when the SQLState class value + * is '40', or under vendor-specified conditions. This indicates that the + * current statement was automatically rolled back by the database because + * of deadlock or other transaction serialization failures. + *

    + * Please consult your driver vendor documentation for the vendor-specified + * conditions for which this Exception may be thrown. * @since 1.6 */ public class SQLTransactionRollbackException extends SQLTransientException { diff --git a/jdk/src/share/classes/java/sql/SQLTransientConnectionException.java b/jdk/src/share/classes/java/sql/SQLTransientConnectionException.java index 865793c1559..3a0e8ea088d 100644 --- a/jdk/src/share/classes/java/sql/SQLTransientConnectionException.java +++ b/jdk/src/share/classes/java/sql/SQLTransientConnectionException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2006, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,11 +27,12 @@ package java.sql; /** * The subclass of {@link SQLException} for the SQLState class - * value '08', representing - * that the connection operation that failed might be able to succeed when + * value '08', or under vendor-specified conditions. This indicates + * that the connection operation that failed might be able to succeed if * the operation is retried without any application-level changes. - *

    - * + *

    + * Please consult your driver vendor documentation for the vendor-specified + * conditions for which this Exception may be thrown. * @since 1.6 */ public class SQLTransientConnectionException extends java.sql.SQLTransientException { From 96eebc523f2f04b6e4b58ed92f3b1e3232085a79 Mon Sep 17 00:00:00 2001 From: Lance Andersen Date: Sat, 4 Sep 2010 13:56:27 -0400 Subject: [PATCH 041/128] 6843995: RowSet 1.1 updates Reviewed-by: darcy, valeriep --- .../com/sun/rowset/RowSetFactoryImpl.java | 69 +++ .../javax/sql/rowset/CachedRowSet.java | 86 ++-- .../javax/sql/rowset/RowSetFactory.java | 99 ++++ .../javax/sql/rowset/RowSetProvider.java | 305 ++++++++++++ .../classes/javax/sql/rowset/package.html | 30 +- .../javax/sql/rowset/spi/SyncFactory.java | 456 ++++++++++-------- .../javax/sql/rowset/spi/SyncProvider.java | 24 +- 7 files changed, 794 insertions(+), 275 deletions(-) create mode 100644 jdk/src/share/classes/com/sun/rowset/RowSetFactoryImpl.java create mode 100644 jdk/src/share/classes/javax/sql/rowset/RowSetFactory.java create mode 100644 jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java diff --git a/jdk/src/share/classes/com/sun/rowset/RowSetFactoryImpl.java b/jdk/src/share/classes/com/sun/rowset/RowSetFactoryImpl.java new file mode 100644 index 00000000000..6f1c0fa385e --- /dev/null +++ b/jdk/src/share/classes/com/sun/rowset/RowSetFactoryImpl.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.rowset; + +import java.sql.SQLException; +import javax.sql.rowset.CachedRowSet; +import javax.sql.rowset.FilteredRowSet; +import javax.sql.rowset.JdbcRowSet; +import javax.sql.rowset.JoinRowSet; +import javax.sql.rowset.WebRowSet; +import javax.sql.rowset.RowSetFactory; + +/** + * This is the implementation specific class for the + * javax.sql.rowset.spi.RowSetFactory. This is the platform + * default implementation for the Java SE platform. + * + * @author Lance Andersen + * + * + * @version 1.7 + */ +public final class RowSetFactoryImpl implements RowSetFactory { + + public CachedRowSet createCachedRowSet() throws SQLException { + return new com.sun.rowset.CachedRowSetImpl(); + } + + public FilteredRowSet createFilteredRowSet() throws SQLException { + return new com.sun.rowset.FilteredRowSetImpl(); + } + + + public JdbcRowSet createJdbcRowSet() throws SQLException { + return new com.sun.rowset.JdbcRowSetImpl(); + } + + public JoinRowSet createJoinRowSet() throws SQLException { + return new com.sun.rowset.JoinRowSetImpl(); + } + + public WebRowSet createWebRowSet() throws SQLException { + return new com.sun.rowset.WebRowSetImpl(); + } + +} diff --git a/jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java b/jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java index c03d5534345..2a60bb3b7e7 100644 --- a/jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java +++ b/jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -644,10 +644,10 @@ public interface CachedRowSet extends RowSet, Joinable { * of execute that takes a ResultSet object. * * @param data the ResultSet object containing the data - * to be read into this CachedRowSet object + * to be read into this CachedRowSet object * @throws SQLException if a null ResultSet object is supplied - * or this CachedRowSet object cannot - * retrieve the associated ResultSetMetaData object + * or this CachedRowSet object cannot + * retrieve the associated ResultSetMetaData object * @see #execute * @see java.sql.ResultSet * @see java.sql.ResultSetMetaData @@ -674,10 +674,10 @@ public interface CachedRowSet extends RowSet, Joinable { * to commit outstanding updates, those updates are lost. * * @param conn a standard JDBC Connection object with valid - * properties + * properties * @throws SQLException if an invalid Connection object is supplied - * or an error occurs in establishing the connection to the - * data source + * or an error occurs in establishing the connection to the + * data source * @see #populate * @see java.sql.Connection */ @@ -736,8 +736,8 @@ public interface CachedRowSet extends RowSet, Joinable { * * @throws SQLException if the cursor is on the insert row * @throws SyncProviderException if the underlying - * synchronization provider's writer fails to write the updates - * back to the data source + * synchronization provider's writer fails to write the updates + * back to the data source * @see #acceptChanges(java.sql.Connection) * @see javax.sql.RowSetWriter * @see javax.sql.rowset.spi.SyncFactory @@ -807,8 +807,8 @@ public interface CachedRowSet extends RowSet, Joinable { * @param con a standard JDBC Connection object * @throws SQLException if the cursor is on the insert row * @throws SyncProviderException if the underlying - * synchronization provider's writer fails to write the updates - * back to the data source + * synchronization provider's writer fails to write the updates + * back to the data source * @see #acceptChanges() * @see javax.sql.RowSetWriter * @see javax.sql.rowset.spi.SyncFactory @@ -867,7 +867,7 @@ public interface CachedRowSet extends RowSet, Joinable { * the rowset's Java VM resources. * * @throws SQLException if an error occurs flushing the contents of this - * CachedRowSet object + * CachedRowSet object * @see javax.sql.RowSetListener#rowSetChanged * @see java.sql.ResultSet#close */ @@ -948,9 +948,9 @@ public interface CachedRowSet extends RowSet, Joinable { * * @param idx an int identifying the column to be checked for updates * @return true if the designated column has been visibly updated; - * false otherwise + * false otherwise * @throws SQLException if the cursor is on the insert row, before the first row, - * or after the last row + * or after the last row * @see java.sql.DatabaseMetaData#updatesAreDetected */ public boolean columnUpdated(int idx) throws SQLException; @@ -963,9 +963,9 @@ public interface CachedRowSet extends RowSet, Joinable { * @param columnName a String object giving the name of the * column to be checked for updates * @return true if the column has been visibly updated; - * false otherwise + * false otherwise * @throws SQLException if the cursor is on the insert row, before the first row, - * or after the last row + * or after the last row * @see java.sql.DatabaseMetaData#updatesAreDetected */ public boolean columnUpdated(String columnName) throws SQLException; @@ -1003,7 +1003,7 @@ public interface CachedRowSet extends RowSet, Joinable { *

    * * @return a Collection object that contains the values in - * each row in this CachedRowSet object + * each row in this CachedRowSet object * @throws SQLException if an error occurs generating the collection * @see #toCollection(int) * @see #toCollection(String) @@ -1030,10 +1030,10 @@ public interface CachedRowSet extends RowSet, Joinable { * @param column an int indicating the column whose values * are to be represented in a Collection object * @return a Collection object that contains the values - * stored in the specified column of this CachedRowSet - * object + * stored in the specified column of this CachedRowSet + * object * @throws SQLException if an error occurs generating the collection or - * an invalid column id is provided + * an invalid column id is provided * @see #toCollection * @see #toCollection(String) */ @@ -1059,10 +1059,10 @@ public interface CachedRowSet extends RowSet, Joinable { * @param column a String object giving the name of the * column whose values are to be represented in a collection * @return a Collection object that contains the values - * stored in the specified column of this CachedRowSet - * object + * stored in the specified column of this CachedRowSet + * object * @throws SQLException if an error occurs generating the collection or - * an invalid column id is provided + * an invalid column id is provided * @see #toCollection * @see #toCollection(int) */ @@ -1100,7 +1100,7 @@ public interface CachedRowSet extends RowSet, Joinable { * @return the SyncProvider object that was set when the rowset * was instantiated, or if none was was set, the default provider * @throws SQLException if an error occurs while returning the - * SyncProvider object + * SyncProvider object * @see #setSyncProvider */ public SyncProvider getSyncProvider() throws SQLException; @@ -1127,7 +1127,7 @@ public interface CachedRowSet extends RowSet, Joinable { * @param provider a String object giving the fully qualified class * name of a SyncProvider implementation * @throws SQLException if an error occurs while attempting to reset the - * SyncProvider implementation + * SyncProvider implementation * @see #getSyncProvider */ public void setSyncProvider(String provider) throws SQLException; @@ -1152,9 +1152,9 @@ public interface CachedRowSet extends RowSet, Joinable { * object to the rowset. * * @param md a RowSetMetaData object containing - * metadata about the columns in this CachedRowSet object + * metadata about the columns in this CachedRowSet object * @throws SQLException if invalid metadata is supplied to the - * rowset + * rowset */ public void setMetaData(RowSetMetaData md) throws SQLException; @@ -1183,7 +1183,7 @@ public interface CachedRowSet extends RowSet, Joinable { * @return a ResultSet object that contains the original value for * this CachedRowSet object * @throws SQLException if an error occurs producing the - * ResultSet object + * ResultSet object */ public ResultSet getOriginal() throws SQLException; @@ -1217,7 +1217,7 @@ public interface CachedRowSet extends RowSet, Joinable { * A call to setOriginalRow is irreversible. * * @throws SQLException if there is no current row or an error is - * encountered resetting the contents of the original row + * encountered resetting the contents of the original row * @see #getOriginalRow */ public void setOriginalRow() throws SQLException; @@ -1326,7 +1326,7 @@ public interface CachedRowSet extends RowSet, Joinable { * as this CachedRowSet object and that has a cursor over * the same data * @throws SQLException if an error occurs or cloning is not - * supported in the underlying platform + * supported in the underlying platform * @see javax.sql.RowSetEvent * @see javax.sql.RowSetListener */ @@ -1344,10 +1344,10 @@ public interface CachedRowSet extends RowSet, Joinable { * established must be maintained. * * @return a new RowSet object that is a deep copy - * of this CachedRowSet object and is - * completely independent of this CachedRowSet object + * of this CachedRowSet object and is + * completely independent of this CachedRowSet object * @throws SQLException if an error occurs in generating the copy of - * the of this CachedRowSet object + * the of this CachedRowSet object * @see #createShared * @see #createCopySchema * @see #createCopyNoConstraints @@ -1396,10 +1396,10 @@ public interface CachedRowSet extends RowSet, Joinable { * in the copy. * * @return a new CachedRowSet object that is a deep copy - * of this CachedRowSet object and is - * completely independent of this CachedRowSet object + * of this CachedRowSet object and is + * completely independent of this CachedRowSet object * @throws SQLException if an error occurs in generating the copy of - * the of this CachedRowSet object + * the of this CachedRowSet object * @see #createCopy * @see #createShared * @see #createCopySchema @@ -1445,7 +1445,7 @@ public interface CachedRowSet extends RowSet, Joinable { * @return true if deleted rows are visible; * false otherwise * @throws SQLException if a rowset implementation is unable to - * to determine whether rows marked for deletion are visible + * to determine whether rows marked for deletion are visible * @see #setShowDeleted */ public boolean getShowDeleted() throws SQLException; @@ -1467,7 +1467,7 @@ public interface CachedRowSet extends RowSet, Joinable { * @param b true if deleted rows should be shown; * false otherwise * @exception SQLException if a rowset implementation is unable to - * to reset whether deleted rows should be visible + * to reset whether deleted rows should be visible * @see #getShowDeleted */ public void setShowDeleted(boolean b) throws SQLException; @@ -1523,9 +1523,12 @@ public interface CachedRowSet extends RowSet, Joinable { * set to false, the changes will not be committed until one of the * CachedRowSet interface transaction methods is called. * + * @deprecated Because this field is final (it is part of an interface), + * its value cannot be changed. * @see #commit * @see #rollback */ + @Deprecated public static final boolean COMMIT_ON_ACCEPT_CHANGES = true; /** @@ -1562,10 +1565,10 @@ public interface CachedRowSet extends RowSet, Joinable { * @param startRow the position in the ResultSet from where to start * populating the records in this CachedRowSet * @param rs the ResultSet object containing the data - * to be read into this CachedRowSet object + * to be read into this CachedRowSet object * @throws SQLException if a null ResultSet object is supplied - * or this CachedRowSet object cannot - * retrieve the associated ResultSetMetaData object + * or this CachedRowSet object cannot + * retrieve the associated ResultSetMetaData object * @see #execute * @see #populate(ResultSet) * @see java.sql.ResultSet @@ -1620,3 +1623,4 @@ public interface CachedRowSet extends RowSet, Joinable { public boolean previousPage() throws SQLException; } + diff --git a/jdk/src/share/classes/javax/sql/rowset/RowSetFactory.java b/jdk/src/share/classes/javax/sql/rowset/RowSetFactory.java new file mode 100644 index 00000000000..71d2ec531cf --- /dev/null +++ b/jdk/src/share/classes/javax/sql/rowset/RowSetFactory.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.sql.rowset; + +import java.sql.SQLException; + +/** + * An interface that defines the implementation of a factory that is used + * to obtain different types of {@code RowSet} implementations. + * + * @author Lance Andersen + * @since 1.7 + */ +public interface RowSetFactory{ + + /** + *

    Creates a new instance of a CachedRowSet.

    + * + * @return A new instance of a CachedRowSet. + * + * @throws SQLException if a CachedRowSet cannot + * be created. + * + * @since 1.7 + */ + public CachedRowSet createCachedRowSet() throws SQLException; + + /** + *

    Creates a new instance of a FilteredRowSet.

    + * + * @return A new instance of a FilteredRowSet. + * + * @throws SQLException if a FilteredRowSet cannot + * be created. + * + * @since 1.7 + */ + public FilteredRowSet createFilteredRowSet() throws SQLException; + + /** + *

    Creates a new instance of a JdbcRowSet.

    + * + * @return A new instance of a JdbcRowSet. + * + * @throws SQLException if a JdbcRowSet cannot + * be created. + * + * @since 1.7 + */ + public JdbcRowSet createJdbcRowSet() throws SQLException; + + /** + *

    Creates a new instance of a JoinRowSet.

    + * + * @return A new instance of a JoinRowSet. + * + * @throws SQLException if a JoinRowSet cannot + * be created. + * + * @since 1.7 + */ + public JoinRowSet createJoinRowSet() throws SQLException; + + /** + *

    Creates a new instance of a WebRowSet.

    + * + * @return A new instance of a WebRowSet. + * + * @throws SQLException if a WebRowSet cannot + * be created. + * + * @since 1.7 + */ + public WebRowSet createWebRowSet() throws SQLException; + +} \ No newline at end of file diff --git a/jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java b/jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java new file mode 100644 index 00000000000..1a84161ce15 --- /dev/null +++ b/jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.sql.rowset; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.sql.SQLException; +import java.util.ServiceLoader; +import javax.sql.rowset.RowSetFactory; + +/** + * A factory API that enables applications to obtain a + * {@code RowSetFactory} implementation that can be used to create different + * types of {@code RowSet} implementations. + *

    + * Example: + *

    + *
    + * RowSetFactory aFactory = RowSetProvider.newFactory();
    + * CachedRowSet crs = aFactory.createCachedRowSet();
    + * ...
    + * RowSetFactory rsf = RowSetProvider.newFactory("com.sun.rowset.RowSetFactoryImpl", null);
    + * WebRowSet wrs = rsf.createWebRowSet();
    + * 
    + *

    + * Tracing of this class may be enabled by setting the System property + * {@code javax.sql.rowset.RowSetFactory.debug} to any value but {@code false}. + *

    + * + * @author Lance Andersen + * @since 1.7 + */ +public class RowSetProvider { + + private static final String ROWSET_DEBUG_PROPERTY = "javax.sql.rowset.RowSetProvider.debug"; + private static final String ROWSET_FACTORY_IMPL = "com.sun.rowset.RowSetFactoryImpl"; + private static final String ROWSET_FACTORY_NAME = "javax.sql.rowset.RowSetFactory"; + /** + * Internal debug flag. + */ + private static boolean debug = true; + + + static { + // Check to see if the debug property is set + String val = getSystemProperty(ROWSET_DEBUG_PROPERTY); + // Allow simply setting the prop to turn on debug + debug = val != null && !"false".equals(val); + } + + + protected RowSetProvider () { + } + + /** + *

    Creates a new instance of a RowSetFactory + * implementation. This method uses the following + * look up order to determine + * the RowSetFactory implementation class to load:

    + *
      + *
    • + * The System property {@code javax.sql.rowset.RowsetFactory}. For example: + *
        + *
      • + * -Djavax.sql.rowset.RowsetFactory=com.sun.rowset.RowSetFactoryImpl + *
      • + *
      + *
    • + * The ServiceLocator API. The ServiceLocator API will look + * for a classname in the file + * {@code META-INF/services/javax.sql.rowset.RowSetFactory} + * in jars available to the runtime. For example, to have the the RowSetFactory + * implementation {@code com.sun.rowset.RowSetFactoryImpl } loaded, the + * entry in {@code META-INF/services/javax.sql.rowset.RowSetFactory} would be: + *
        + *
      • + * {@code com.sun.rowset.RowSetFactoryImpl } + *
      • + *
      + *
    • + *
    • + * Platform default RowSetFactory instance. + *
    • + *
    + * + *

    Once an application has obtained a reference to a {@code RowSetFactory}, + * it can use the factory to obtain RowSet instances.

    + * + * @return New instance of a RowSetFactory + * + * @throws SQLException if the default factory class cannot be loaded, + * instantiated. The cause will be set to actual Exception + * + * @see ServiceLoader + * @since 1.7 + */ + public static RowSetFactory newFactory() + throws SQLException { + // Use the system property first + RowSetFactory factory = null; + String factoryClassName = null; + try { + trace("Checking for Rowset System Property..."); + factoryClassName = getSystemProperty(ROWSET_FACTORY_NAME); + if (factoryClassName != null) { + trace("Found system property, value=" + factoryClassName); + factory = (RowSetFactory) getFactoryClass(factoryClassName, null, true).newInstance(); + } + } catch (ClassNotFoundException e) { + throw new SQLException( + "RowSetFactory: " + factoryClassName + " not found", e); + } catch (Exception e) { + throw new SQLException( + "RowSetFactory: " + factoryClassName + " could not be instantiated: " + e, + e); + } + + // Check to see if we found the RowSetFactory via a System property + if (factory == null) { + // If the RowSetFactory is not found via a System Property, now + // look it up via the ServiceLoader API and if not found, use the + // Java SE default. + factory = loadViaServiceLoader(); + factory = + factory == null ? newFactory(ROWSET_FACTORY_IMPL, null) : factory; + } + return (factory); + } + + /** + *

    Creates a new instance of a RowSetFactory from the + * specified factory class name. + * This function is useful when there are multiple providers in the classpath. + * It gives more control to the application as it can specify which provider + * should be loaded.

    + * + *

    Once an application has obtained a reference to a RowSetFactory + * it can use the factory to obtain RowSet instances.

    + * + * @param factoryClassName fully qualified factory class name that + * provides an implementation of javax.sql.rowset.RowSetFactory. + * + * @param cl ClassLoader used to load the factory + * class. If null current Thread's context + * classLoader is used to load the factory class. + * + * @return New instance of a RowSetFactory + * + * @throws SQLException if factoryClassName is + * null, or the factory class cannot be loaded, instantiated. + * + * @see #newFactory() + * + * @since 1.7 + */ + public static RowSetFactory newFactory(String factoryClassName, ClassLoader cl) + throws SQLException { + + trace("***In newInstance()"); + try { + Class providerClass = getFactoryClass(factoryClassName, cl, false); + RowSetFactory instance = (RowSetFactory) providerClass.newInstance(); + if (debug) { + trace("Created new instance of " + providerClass + + " using ClassLoader: " + cl); + } + return instance; + } catch (ClassNotFoundException x) { + throw new SQLException( + "Provider " + factoryClassName + " not found", x); + } catch (Exception x) { + throw new SQLException( + "Provider " + factoryClassName + " could not be instantiated: " + x, + x); + } + } + + /* + * Returns the class loader to be used. + * @return The ClassLoader to use. + * + */ + static private ClassLoader getContextClassLoader() throws SecurityException { + return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { + + public Object run() { + ClassLoader cl = null; + + cl = Thread.currentThread().getContextClassLoader(); + + if (cl == null) { + cl = ClassLoader.getSystemClassLoader(); + } + + return cl; + } + }); + } + + /** + * Attempt to load a class using the class loader supplied. If that fails + * and fall back is enabled, the current (i.e. bootstrap) class loader is + * tried. + * + * If the class loader supplied is null, first try using the + * context class loader followed by the current class loader. + * @return The class which was loaded + */ + static private Class getFactoryClass(String factoryClassName, ClassLoader cl, + boolean doFallback) throws ClassNotFoundException { + try { + if (cl == null) { + cl = getContextClassLoader(); + if (cl == null) { + throw new ClassNotFoundException(); + } else { + return cl.loadClass(factoryClassName); + } + } else { + return cl.loadClass(factoryClassName); + } + } catch (ClassNotFoundException e) { + if (doFallback) { + // Use current class loader + return Class.forName(factoryClassName, true, RowSetFactory.class.getClassLoader()); + } else { + throw e; + } + } + } + + /** + * Use the ServiceLoader mechanism to load the default RowSetFactory + * @return default RowSetFactory Implementation + */ + static private RowSetFactory loadViaServiceLoader() { + RowSetFactory theFactory = null; + trace("***in loadViaServiceLoader()"); + for (RowSetFactory factory : ServiceLoader.load(javax.sql.rowset.RowSetFactory.class)) { + trace(" Loading done by the java.util.ServiceLoader :" + factory.getClass().getName()); + theFactory = factory; + break; + } + return theFactory; + + } + + /** + * Returns the requested System Property. If a {@code SecurityException} + * occurs, just return NULL + * @param propName - System property to retreive + * @return The System property value or NULL if the property does not exist + * or a {@code SecurityException} occurs. + */ + static private String getSystemProperty(final String propName) { + String property = null; + try { + property = (String) AccessController.doPrivileged(new PrivilegedAction() { + + public Object run() { + return System.getProperty(propName); + } + }); + } catch (SecurityException se) { + if (debug) { + se.printStackTrace(); + } + } + return property; + } + + /** + * Debug routine which will output tracing if the System Property + * -Djavax.sql.rowset.RowSetFactory.debug is set + * @param msg - The debug message to display + */ + private static void trace(String msg) { + if (debug) { + System.err.println("###RowSets: " + msg); + } + } +} diff --git a/jdk/src/share/classes/javax/sql/rowset/package.html b/jdk/src/share/classes/javax/sql/rowset/package.html index 41d00d565b5..8b905cd63aa 100644 --- a/jdk/src/share/classes/javax/sql/rowset/package.html +++ b/jdk/src/share/classes/javax/sql/rowset/package.html @@ -5,7 +5,7 @@