void output_dic_data (void) { fprintf (stderr, "%d words are in this dictionary\n", jt.maxserial); if (little_endian ()) { rev_dic_data (); } jt.syurui = which_dict; jt.gosuu = jt.maxserial; output_header (ofpter, &jt, &file_head); /* dummy; Will be rewitten. */ output_comment (ofpter); output_hinsi_list (ofpter); output_hindo (ofpter); output_hinsi (ofpter); #ifdef CONVERT_with_SiSheng if (which_dict == CWNN_REV_DICT) output_sisheng (ofpter); #endif output_kanji (ofpter); }
int main (int argc, char** argv) { char *cswidth_name; com_name = argv[0]; init (argc, argv); if ((cswidth_name = get_cswidth_name (WNN_DEFAULT_LANG)) != NULL) { set_cswidth (create_cswidth (cswidth_name)); } #ifdef CHINESE ujis_header (&which_dict); /* read header of UJIS dic */ #else ujis_header (); /* read header of UJIS dic */ #endif /* like comment,total,hinsi */ #ifdef CHINESE read_ujis (reverse_dict, to_esc, which_dict); if (which_dict != CWNN_REV_DICT && which_dict != BWNN_REV_DICT) reverse_yomi (); #else read_ujis (reverse_dict, to_esc, (which_dict == WNN_REV_DICT) ? 1 : 0); #ifndef CONVERT_from_TOP reverse_yomi (); #endif #endif if ((ofpter = fopen (outfile, "w")) == NULL) { fprintf (stderr, "Can't open the output file %s.\n", outfile); perror (""); exit (1); } #ifdef CHINESE if ((which_dict & 0xff) == WNN_REV_DICT) { #else if (which_dict == WNN_REV_DICT) { #endif create_rev_dict (); } else { alloc_area (); if (which_dict == WNN_STATIC_DICT) { sdic_sort (); uniq_je (sort_func_sdic); output_dic_data (); ujistosd (0, 0); } else { sort_if_not_sorted (); uniq_je (sort_func_je); output_dic_data (); ujistoud (); set_pter1 (); } } output_dic_index (); rewind (ofpter); output_header (ofpter, &jt, &file_head); #ifdef nodef output_comment (ofpter); /* In order to change the byte order */ output_hinsi_list (ofpter); /* In order to change the byte order */ #endif exit (0); } w_char * addyomient (int tn, w_char* yomi) { int len = wnn_Strlen (yomi); tary[tn].yomi2 = 0; tary[tn].yomi1 = yomi[0] << 16; uhopter->yomi[0] = len; if (yomi[1]) { tary[tn].yomi1 |= yomi[1]; if (yomi[2]) { tary[tn].yomi2 = yomi[2] << 16; if (yomi[3]) { tary[tn].yomi2 |= yomi[3]; } if (len > 4) { wnn_Strncpy (uhopter->yomi + 1, yomi + 4, len - 4); return (uhopter->yomi + 1 + len - 4); } } } return (uhopter->yomi + 1); }
void output_node(NODE *node, int break_label, int continue_label) { NODE *n; int top, cont, out, bottom, not, tmp1, imm, state; int stack_size; static int last_line = -1; if (node == NULL) { return; } // In case we call yyerror(). yylineno = node->line; if (node->line != last_line && node->op != ';' && node->op != FOR) { last_line = node->line; /* fprintf(outf, "%d, %s\n", node->op, get_op_name(node->op)); */ output_line(node->line); } switch (node->op) { case NUMBER: output_code("LD", "HL, %d", node->data.value); break; case STRING: output_code("LD", "HL, %s", node->data.address); break; case IDENT: if (node->data.var->scope == SCOPE_GLOBAL) { if (node->lhs) { output_code("LD", "IX, _%s", node->data.var->name); } else if (node->data.var->decl->decl_type == DECL_ARRAY) { output_code("LD", "HL, _%s", node->data.var->name); } else { output_code("LD", "HL, (_%s)", node->data.var->name); } } else { if (node->lhs) { output_code("PUSH", "IY"); output_code("POP", "IX"); output_code("LD", "BC, %d", node->data.var->offset); output_code("ADD", "IX, BC"); } else if (node->data.var->decl->decl_type == DECL_ARRAY) { output_code("LD", "BC, %d", node->data.var->offset); output_code("PUSH", "IY"); output_code("POP", "HL"); output_code("ADD", "HL, BC"); } else { output_code("LD", "L, (IY + %d)", node->data.var->offset); output_code("LD", "H, (IY + %d)", node->data.var->offset + 1); } } break; case '(': /* limited function call support */ stack_size = output_parameters(node->arg[1], break_label, continue_label); output_code("CALL", "_%s", node->arg[0]->data.var->name); while (stack_size-- > 0) { output_code("INC", "SP"); } break; case INCR: output_node(node->arg[0], break_label, continue_label); /* Address is in IX */ if (node->data.detail == -1) { /* Preincrement */ output_code("LD", "L, (IX + 0)"); output_code("LD", "H, (IX + 1)"); output_code("INC", "HL"); output_code("LD", "(IX + 0), L"); output_code("LD", "(IX + 1), H"); } else { /* Postincrement */ output_code("LD", "L, (IX + 0)"); output_code("LD", "H, (IX + 1)"); output_code("LD", "E, L"); output_code("LD", "D, H"); output_code("INC", "DE"); output_code("LD", "(IX + 0), E"); output_code("LD", "(IX + 1), D"); } break; case DECR: output_node(node->arg[0], break_label, continue_label); /* Address is in IX */ if (node->data.detail == -1) { /* Predecrement */ output_code("LD", "L, (IX + 0)"); output_code("LD", "H, (IX + 1)"); output_code("DEC", "HL"); output_code("LD", "(IX + 0), L"); output_code("LD", "(IX + 1), H"); } else { /* Postdecrement */ output_code("LD", "L, (IX + 0)"); output_code("LD", "H, (IX + 1)"); output_code("LD", "E, L"); output_code("LD", "D, H"); output_code("DEC", "DE"); output_code("LD", "(IX + 0), E"); output_code("LD", "(IX + 1), D"); } break; case CAST: output_node(node->arg[0], break_label, continue_label); /* * Use get_decl_size() to do the right thing here. Not * necessary right now. */ break; case SIZEOF: output_code("LD", "HL, %d", get_decl_size(node->arg[0]->decl)); break; case '*': if (node->numargs == 1) { // Pointer dereference. output_node(node->arg[0], break_label, continue_label); output_code("PUSH", "HL"); output_code("POP", "IX"); if (!node->lhs) { // Actually dereference it. output_code("LD", "H, (IX + 1)"); output_code("LD", "L, (IX)"); } } else { // Multiplication. if (node->arg[0]->op == NUMBER || node->arg[1]->op == NUMBER) { if (node->arg[0]->op == NUMBER) { n = node->arg[0]; node->arg[0] = node->arg[1]; node->arg[1] = n; } output_node(node->arg[0], break_label, continue_label); imm = node->arg[1]->data.value; if (imm < 0) { imm = -imm; output_code("LD", "A, 255"); output_code("XOR", "H"); output_code("XOR", "L"); output_code("INC", "HL"); } if (imm == 0) { output_code("LD", "HL, 0"); } else if ((imm & (imm - 1)) == 0) { /* Power of two */ while (imm != 1) { output_code("ADD", "HL, HL"); imm >>= 1; } } else { if ((imm & 1) != 0) { output_code("LD", "D, H"); output_code("LD", "E, L"); imm &= ~1; } else { output_code("LD", "DE, 0"); } state = 0; /* state = 1 when HL contains the output */ while (imm != 1) { if ((imm & 1) != 0) { if (!state) { output_code("EX", "DE, HL"); } state = 1; output_code("ADD", "HL, DE"); } if (state) { output_code("EX", "DE, HL"); state = 0; } output_code("ADD", "HL, HL"); imm >>= 1; } /* Doesn't matter what "state" is */ output_code("ADD", "HL, DE"); } } else { output_comment("Unsupported operands: %s.", get_op_name(node->op)); unsupported++; } }