static void uncrustify_file(const file_mem& fm, FILE *pfout, const char *parsed_file) { const deque<int>& data = fm.data; /* Save off the encoding and whether a BOM is required */ cpd.bom = fm.bom; cpd.enc = fm.enc; if (cpd.settings[UO_utf8_force].b || ((cpd.enc == ENC_BYTE) && cpd.settings[UO_utf8_byte].b)) { cpd.enc = ENC_UTF8; } argval_t av; switch (cpd.enc) { case ENC_UTF8: av = cpd.settings[UO_utf8_bom].a; break; case ENC_UTF16_LE: case ENC_UTF16_BE: av = AV_FORCE; break; default: av = AV_IGNORE; break; } if (av == AV_REMOVE) { cpd.bom = false; } else if (av != AV_IGNORE) { cpd.bom = true; } /* Check for embedded 0's (represents a decoding failure or corrupt file) */ for (int idx = 0; idx < (int)data.size() - 1; idx++) { if (data[idx] == 0) { LOG_FMT(LERR, "An embedded 0 was found in '%s'.\n", cpd.filename); LOG_FMT(LERR, "The file may be encoded in an unsupported Unicode format.\n"); LOG_FMT(LERR, "Aborting.\n"); cpd.error_count++; return; } } uncrustify_start(data); /** * Done with detection. Do the rest only if the file will go somewhere. * The detection code needs as few changes as possible. */ if (pfout != NULL) { /** * Add comments before function defs and classes */ if (cpd.func_hdr.data.size() > 0) { add_func_header(CT_FUNC_DEF, cpd.func_hdr); } if (cpd.class_hdr.data.size() > 0) { add_func_header(CT_CLASS, cpd.class_hdr); } if (cpd.oc_msg_hdr.data.size() > 0) { add_msg_header(CT_OC_MSG_DECL, cpd.oc_msg_hdr); } /** * Change virtual braces into real braces... */ do_braces(); /* Scrub extra semicolons */ if (cpd.settings[UO_mod_remove_extra_semicolon].b) { remove_extra_semicolons(); } /* Remove unnecessary returns */ if (cpd.settings[UO_mod_remove_empty_return].b) { remove_extra_returns(); } /** * Add parens */ do_parens(); /** * Modify line breaks as needed */ bool first = true; int old_changes; if (cpd.settings[UO_nl_remove_extra_newlines].n == 2) { newlines_remove_newlines(); } cpd.pass_count = 3; do { old_changes = cpd.changes; LOG_FMT(LNEWLINE, "Newline loop start: %d\n", cpd.changes); newlines_cleanup_dup(); newlines_cleanup_braces(first); if (cpd.settings[UO_nl_after_multiline_comment].b) { newline_after_multiline_comment(); } newlines_insert_blank_lines(); if (cpd.settings[UO_pos_bool].tp != TP_IGNORE) { newlines_chunk_pos(CT_BOOL, cpd.settings[UO_pos_bool].tp); } if (cpd.settings[UO_pos_compare].tp != TP_IGNORE) { newlines_chunk_pos(CT_COMPARE, cpd.settings[UO_pos_compare].tp); } if (cpd.settings[UO_pos_conditional].tp != TP_IGNORE) { newlines_chunk_pos(CT_COND_COLON, cpd.settings[UO_pos_conditional].tp); newlines_chunk_pos(CT_QUESTION, cpd.settings[UO_pos_conditional].tp); } if (cpd.settings[UO_pos_comma].tp != TP_IGNORE) { newlines_chunk_pos(CT_COMMA, cpd.settings[UO_pos_comma].tp); } if (cpd.settings[UO_pos_assign].tp != TP_IGNORE) { newlines_chunk_pos(CT_ASSIGN, cpd.settings[UO_pos_assign].tp); } if (cpd.settings[UO_pos_arith].tp != TP_IGNORE) { newlines_chunk_pos(CT_ARITH, cpd.settings[UO_pos_arith].tp); } newlines_class_colon_pos(); if (cpd.settings[UO_nl_squeeze_ifdef].b) { newlines_squeeze_ifdef(); } do_blank_lines(); newlines_eat_start_end(); newlines_cleanup_dup(); first = false; } while ((old_changes != cpd.changes) && (cpd.pass_count-- > 0)); mark_comments(); /** * Add balanced spaces around nested params */ if (cpd.settings[UO_sp_balance_nested_parens].b) { space_text_balance_nested_parens(); } /* Scrub certain added semicolons */ if (((cpd.lang_flags & LANG_PAWN) != 0) && cpd.settings[UO_mod_pawn_semicolon].b) { pawn_scrub_vsemi(); } /* Sort imports/using/include */ if (cpd.settings[UO_mod_sort_import].b || cpd.settings[UO_mod_sort_include].b || cpd.settings[UO_mod_sort_using].b) { sort_imports(); } /** * Fix same-line inter-chunk spacing */ space_text(); /** * Do any aligning of preprocessors */ if (cpd.settings[UO_align_pp_define_span].n > 0) { align_preprocessor(); } /** * Indent the text */ indent_preproc(); indent_text(); /* Insert trailing comments after certain close braces */ if ((cpd.settings[UO_mod_add_long_switch_closebrace_comment].n > 0) || (cpd.settings[UO_mod_add_long_function_closebrace_comment].n > 0)) { add_long_closebrace_comment(); } /* Insert trailing comments after certain preprocessor conditional blocks */ if ((cpd.settings[UO_mod_add_long_ifdef_else_comment].n > 0) || (cpd.settings[UO_mod_add_long_ifdef_endif_comment].n > 0)) { add_long_preprocessor_conditional_block_comment(); } /** * Align everything else, reindent and break at code_width */ first = true; cpd.pass_count = 3; do { align_all(); indent_text(); old_changes = cpd.changes; if (cpd.settings[UO_code_width].n > 0) { LOG_FMT(LNEWLINE, "Code_width loop start: %d\n", cpd.changes); do_code_width(); if ((old_changes != cpd.changes) && first) { /* retry line breaks caused by splitting 1-liners */ newlines_cleanup_braces(false); newlines_insert_blank_lines(); first = false; } } } while ((old_changes != cpd.changes) && (cpd.pass_count-- > 0)); /** * And finally, align the backslash newline stuff */ align_right_comments(); if (cpd.settings[UO_align_nl_cont].b) { align_backslash_newline(); } /** * Now render it all to the output file */ output_text(pfout); } /* Special hook for dumping parsed data for debugging */ if (parsed_file != NULL) { FILE *p_file = fopen(parsed_file, "w"); if (p_file != NULL) { output_parsed(p_file); fclose(p_file); } else { LOG_FMT(LERR, "%s: Failed to open '%s' for write: %s (%d)\n", __func__, parsed_file, strerror(errno), errno); } } uncrustify_end(); }
static void uncrustify_file(const char *data, int data_len, FILE *pfout, const char *parsed_file) { uncrustify_start(data, data_len); /** * Done with detection. Do the rest only if the file will go somewhere. * The detection code needs as few changes as possible. */ if (pfout != NULL) { /** * Add comments before function defs and classes */ if (cpd.func_hdr.data != NULL) { add_func_header(CT_FUNC_DEF, cpd.func_hdr); } if (cpd.class_hdr.data != NULL) { add_func_header(CT_CLASS, cpd.class_hdr); } /** * Change virtual braces into real braces... */ do_braces(); /* Scrub extra semicolons */ if (cpd.settings[UO_mod_remove_extra_semicolon].b) { remove_extra_semicolons(); } /* Remove unnecessary returns */ if (cpd.settings[UO_mod_remove_empty_return].b) { remove_extra_returns(); } /** * Add parens */ do_parens(); /** * Insert line breaks as needed */ do_blank_lines(); newlines_cleanup_braces(); if (cpd.settings[UO_nl_after_multiline_comment].b) { newline_after_multiline_comment(); } newlines_insert_blank_lines(); if (cpd.settings[UO_pos_bool].tp != TP_IGNORE) { newlines_chunk_pos(CT_BOOL, cpd.settings[UO_pos_bool].tp); } if (cpd.settings[UO_pos_compare].tp != TP_IGNORE) { newlines_chunk_pos(CT_COMPARE, cpd.settings[UO_pos_compare].tp); } if (cpd.settings[UO_pos_conditional].tp != TP_IGNORE) { newlines_chunk_pos(CT_COND_COLON, cpd.settings[UO_pos_conditional].tp); newlines_chunk_pos(CT_QUESTION, cpd.settings[UO_pos_conditional].tp); } if (cpd.settings[UO_pos_comma].tp != TP_IGNORE) { newlines_chunk_pos(CT_COMMA, cpd.settings[UO_pos_comma].tp); } if (cpd.settings[UO_pos_assign].tp != TP_IGNORE) { newlines_chunk_pos(CT_ASSIGN, cpd.settings[UO_pos_assign].tp); } if (cpd.settings[UO_pos_arith].tp != TP_IGNORE) { newlines_chunk_pos(CT_ARITH, cpd.settings[UO_pos_arith].tp); } newlines_class_colon_pos(); if (cpd.settings[UO_nl_squeeze_ifdef].b) { newlines_squeeze_ifdef(); } newlines_eat_start_end(); newlines_cleanup_dup(); mark_comments(); /** * Add balanced spaces around nested params */ if (cpd.settings[UO_sp_balance_nested_parens].b) { space_text_balance_nested_parens(); } /* Scrub certain added semicolons */ if (((cpd.lang_flags & LANG_PAWN) != 0) && cpd.settings[UO_mod_pawn_semicolon].b) { pawn_scrub_vsemi(); } /* Sort imports/using/include */ if (cpd.settings[UO_mod_sort_import].b || cpd.settings[UO_mod_sort_include].b || cpd.settings[UO_mod_sort_using].b) { sort_imports(); } /** * Fix same-line inter-chunk spacing */ space_text(); /** * Do any aligning of preprocessors */ if (cpd.settings[UO_align_pp_define_span].n > 0) { align_preprocessor(); } /** * Indent the text */ indent_preproc(); indent_text(); /* Insert trailing comments after certain close braces */ if ((cpd.settings[UO_mod_add_long_switch_closebrace_comment].n > 0) || (cpd.settings[UO_mod_add_long_function_closebrace_comment].n > 0)) { add_long_closebrace_comment(); } /* Insert trailing comments after certain preprocessor conditional blocks */ if ((cpd.settings[UO_mod_add_long_ifdef_else_comment].n > 0) || (cpd.settings[UO_mod_add_long_ifdef_endif_comment].n > 0)) { add_long_preprocessor_conditional_block_comment(); } /** * Aligning everything else and reindent */ align_all(); indent_text(); if (cpd.settings[UO_code_width].n > 0) { int max_passes = 3; int prev_changes; do { prev_changes = cpd.changes; do_code_width(); if (prev_changes != cpd.changes) { align_all(); indent_text(); } } while ((prev_changes != cpd.changes) && (--max_passes > 0)); } /** * And finally, align the backslash newline stuff */ align_right_comments(); if (cpd.settings[UO_align_nl_cont].b) { align_backslash_newline(); } /** * Now render it all to the output file */ output_text(pfout); } /* Special hook for dumping parsed data for debugging */ if (parsed_file != NULL) { FILE *p_file = fopen(parsed_file, "w"); if (p_file != NULL) { output_parsed(p_file); fclose(p_file); } else { LOG_FMT(LERR, "%s: Failed to open '%s' for write: %s (%d)\n", __func__, parsed_file, strerror(errno), errno); } } uncrustify_end(); }