void last_page_out( void ) { full_page_out(); do_page_out(); // last page return; }
void start_doc_sect( void ) { bool first_section; bool header; bool page_r; doc_section ds; font_number font; spacing_line spacing_ln; page_ej page_e; su *p_sk; su *top_sk; uint32_t ind; xx_str *h_string; if( ProcFlags.start_section ) { return; // once is enough } if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } first_section = (ProcFlags.doc_sect == doc_sect_none); header = false; // no header string (ABSTRACT, ... ) output page_r = false; // no page number reset page_e = ej_no; // no page eject ProcFlags.start_section = true; ProcFlags.keep_left_margin = false; ds = ProcFlags.doc_sect_nxt; // new section if( ds == doc_sect_none ) { ds = doc_sect_body; // if text without section start assume body } /***********************************************************************/ /* process special section attributes */ /***********************************************************************/ switch( ds ) { case doc_sect_body: page_r = layout_work.body.page_reset; page_e = layout_work.body.page_eject; if( layout_work.body.header ) { header = true; h_string = layout_work.body.string; top_sk = &layout_work.body.pre_top_skip; p_sk = &layout_work.body.post_skip; font = layout_work.body.font; spacing_ln = g_spacing_ln; // standard spacing } break; case doc_sect_titlep: // for preceding :BINCLUDE/:GRAPHIC page_e = ej_yes; init_nest_cb( true ); nest_cb->gtag = t_TITLEP; nest_cb->p_stack->lineno = titlep_lineno; // correct line number break; case doc_sect_abstract: page_r = layout_work.abstract.page_reset; page_e = layout_work.abstract.page_eject; if( layout_work.abstract.header ) { header = true; h_string = layout_work.abstract.string; top_sk = &layout_work.abstract.pre_top_skip; p_sk = &layout_work.abstract.post_skip; font = layout_work.abstract.font; spacing_ln = layout_work.abstract.spacing; } break; case doc_sect_preface: page_r = layout_work.preface.page_reset; page_e = layout_work.preface.page_eject; if( layout_work.preface.header ) { header = true; h_string = layout_work.preface.string; top_sk = &layout_work.preface.pre_top_skip; p_sk = &layout_work.preface.post_skip; font = layout_work.preface.font; spacing_ln = layout_work.preface.spacing; } break; case doc_sect_appendix: page_r = layout_work.appendix.page_reset; page_e = layout_work.appendix.page_eject; if( layout_work.appendix.header ) { header = true; h_string = layout_work.appendix.string; top_sk = &layout_work.appendix.pre_top_skip; p_sk = &layout_work.appendix.post_skip; font = layout_work.appendix.font; spacing_ln = layout_work.appendix.spacing; } break; case doc_sect_backm: page_r = layout_work.backm.page_reset; page_e = layout_work.backm.page_eject; if( layout_work.backm.header ) { header = true; h_string = layout_work.backm.string; top_sk = &layout_work.backm.pre_top_skip; p_sk = &layout_work.backm.post_skip; font = layout_work.backm.font; spacing_ln = g_spacing_ln; // standard spacing } break; case doc_sect_index: page_r = layout_work.index.page_reset; page_e = layout_work.index.page_eject; if( layout_work.index.header ) { header = true; h_string = layout_work.index.index_string; top_sk = &layout_work.index.pre_top_skip; p_sk = &layout_work.index.post_skip; font = layout_work.index.font; spacing_ln = layout_work.index.spacing; } break; default: new_section( ds ); break; } if( first_section ) { // nothing precedes the first section if( page_e == ej_even ) { do_page_out(); // apage of first page is odd page = 0; // restart page for first text page } new_section( ds ); reset_t_page(); document_new_position(); // first text page ready for content } else { full_page_out(); // ensure are on last page switch( page_e ) { // page eject requested case ej_yes : finish_page_section( ds, true );// emit last page in old section if( page_r ) { page = 0; } reset_t_page(); break; case ej_odd : if( !(apage & 1) ) { // first page would be even do_page_out(); // emit last page in old section reset_t_page(); } finish_page_section( ds, true );// emit last page in old section if( page_r ) { page = 0; } reset_t_page(); break; case ej_even : if( (apage & 1) ) { // first page will be odd do_page_out(); // emit last page in old section reset_t_page(); } finish_page_section( ds, true );// emit last page in old section if( page_r ) { page = 0; } reset_t_page(); break; default: // ej_no new_section( ds ); /****************************************************/ /* set page bottom banner/limit for new section */ /****************************************************/ ind = !(page & 1); t_page.bottom_banner = sect_ban_bot[ind]; if( sect_ban_bot[ind] != NULL ) { if( bin_driver->y_positive == 0 ) { g_page_bottom = g_page_bottom_org + sect_ban_bot[ind]->ban_depth; } else { g_page_bottom = g_page_bottom_org - sect_ban_bot[ind]->ban_depth; } } else { g_page_bottom = g_page_bottom_org; } break; } } g_cur_left = g_page_left_org; g_cur_h_start = g_page_left_org + g_indent; if( header ) { doc_header( p_sk, top_sk, h_string, font, spacing_ln, page_e == ej_no ); } ProcFlags.doc_sect = ds; }
void start_doc_sect( void ) { bool first_section; bool header; bool page_r; char * h_text; doc_section ds; hdsrc hds_lvl; int k; page_ej page_e; uint32_t page_c; uint32_t page_s; if( ProcFlags.start_section ) { return; // once is enough } if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } scr_process_break(); // commit any prior text first_section = (ProcFlags.doc_sect == doc_sect_none); ProcFlags.start_section = true; ProcFlags.keep_left_margin = false; page_c = layout_work.defaults.columns; ds = ProcFlags.doc_sect_nxt; // new section if( ds == doc_sect_none ) { ds = doc_sect_body; // if text without section start assume body } /***********************************************************************/ /* process special section attributes */ /***********************************************************************/ switch( ds ) { case doc_sect_titlep : page_c = layout_work.titlep.columns; page_e = ej_yes; page_r = false; // no page number reset header = false; // no header string (ABSTRACT, ... ) output init_nest_cb(); nest_cb->p_stack = copy_to_nest_stack(); nest_cb->c_tag = t_TITLEP; nest_cb->p_stack->lineno = titlep_lineno; // correct line number break; case doc_sect_abstract : page_c = layout_work.abstract.columns; page_e = layout_work.abstract.page_eject; page_r = layout_work.abstract.page_reset; page_s = layout_work.hx.hx_sect[hds_abstract].spacing; header = layout_work.hx.hx_sect[hds_abstract].header; if( header ) { h_text = &layout_work.abstract.string; hds_lvl = hds_abstract; } break; case doc_sect_preface : page_c = layout_work.preface.columns; page_e = layout_work.preface.page_eject; page_r = layout_work.preface.page_reset; page_s = layout_work.hx.hx_sect[hds_preface].spacing; header = layout_work.hx.hx_sect[hds_preface].header; if( header ) { h_text = &layout_work.preface.string; hds_lvl = hds_preface; } break; case doc_sect_body : page_c = layout_work.body.columns; page_e = layout_work.body.page_eject; page_r = layout_work.body.page_reset; page_s = layout_work.hx.hx_sect[hds_body].spacing; header = layout_work.hx.hx_sect[hds_body].header; if( header ) { h_text = &layout_work.body.string; hds_lvl = hds_body; } break; case doc_sect_appendix : page_c = layout_work.appendix.columns; page_e = layout_work.appendix.section_eject; page_r = layout_work.appendix.page_reset; page_s = layout_work.hx.hx_sect[hds_appendix].spacing; header = false; // no section header string output, as such if( page_e != ej_no ) { page_e = ej_yes; // "even" and "odd" act like "yes" } for( k = 1; k < hds_appendix; k++ ) { // reset heading levels hd_nums[k].headn = 0; if( hd_nums[k].headnsub != NULL ) { *(hd_nums[k].headnsub->value) = '\0'; } } break; case doc_sect_backm : page_c = layout_work.backm.columns; page_e = layout_work.backm.page_eject; page_r = layout_work.backm.page_reset; page_s = layout_work.hx.hx_sect[hds_backm].spacing; header = layout_work.hx.hx_sect[hds_backm].header; if( header ) { h_text = &layout_work.backm.string; hds_lvl = hds_backm; } break; case doc_sect_index : page_c = layout_work.index.columns; page_e = layout_work.index.page_eject; page_r = layout_work.index.page_reset; page_s = layout_work.hx.hx_sect[hds_index].spacing; header = layout_work.hx.hx_sect[hds_index].header; if( header ) { h_text = &layout_work.index.index_string; hds_lvl = hds_index; } break; case doc_sect_gdoc : case doc_sect_etitlep : case doc_sect_frontm : page_c = layout_work.defaults.columns; page_e = ej_no; // no page eject page_r = false; // no page number reset page_s = layout_work.defaults.spacing; // default spacing header = false; // no section header break; case doc_sect_egdoc : page_c = layout_work.defaults.columns; page_e = ej_yes; page_r = false; // no page number reset page_s = layout_work.defaults.spacing; // default spacing header = false; // no section header break; default: internal_err( __FILE__, __LINE__ ); break; } if( first_section ) { // nothing precedes the first section if( page_e == ej_even ) { do_page_out(); // apage of first page is odd page = 0; // restart page for first text page ProcFlags.page_ejected = true; } set_section_banners( ds ); reset_t_page(); document_new_position(); // first text page ready for content } else if( page_e == ej_no ) { full_page_out(); // ensure are on last page ProcFlags.page_ejected = false; set_section_banners( ds ); reset_bot_ban(); } else { last_page_out(); // ensure last page output ProcFlags.page_ejected = true; // only first section has nothing to output if( page_e == ej_odd ) { if( (page & 1) ) { // first page will be odd do_page_out(); // emit blank page } } else if( page_e == ej_even ) { if( !(page & 1) ) { // first page will be even do_page_out(); // emit blank page } } else if( page_e != ej_yes ) { internal_err( __FILE__, __LINE__ ); } g_skip = 0; // ignore remaining skip value set_section_banners( ds ); reset_t_page(); } ProcFlags.doc_sect = ds; t_page.col_count = page_c; set_cols(); if( page_r ) { page = 0; } spacing = page_s; g_cur_left = g_page_left_org; if( header ) { line_position = pos_center; concat_save = ProcFlags.concat; ProcFlags.concat = true; justify_save = ProcFlags.justify; ProcFlags.justify = ju_off; gen_heading( h_text, NULL, 0, hds_lvl ); g_indent = 0; // reset for section body ProcFlags.concat = concat_save; ProcFlags.justify = justify_save; } g_curr_font = layout_work.defaults.font; g_cur_h_start = g_page_left_org + g_indent; ProcFlags.doc_sect = ds; }