extern void gml_frontm( const gmltag * entry ) { scr_process_break(); gml_doc_xxx( doc_sect_frontm ); if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } ProcFlags.frontm_seen = true; }
void gml_frontm( gml_tag gtag ) { gtag = gtag; gml_doc_xxx( doc_sect_frontm ); g_spacing_ln = layout_work.defaults.spacing; if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } ProcFlags.frontm_seen = true; }
void gml_backm( gml_tag gtag ) { gtag = gtag; if( g_blank_lines_ln > 0 ) { set_skip_vars( NULL, NULL, NULL, 0, 0 ); // set g_blank_lines } scr_process_break(); gml_doc_xxx( doc_sect_backm ); ProcFlags.frontm_seen = false; // no longer in FRONTM section if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } }
void gml_gdoc( gml_tag gtag ) { char * p; gtag = gtag; scan_err = false; p = scan_start; if( *p ) p++; while( *p == ' ' ) { // over WS to attribute p++; } if( *p && ! (strnicmp( "sec ", p, 4 ) && // look for "sec " or "sec=" strnicmp( "sec=", p, 4 )) ) { char quote; char * valstart; p += 3; while( *p == ' ' ) { p++; } if( *p == '=' ) { p++; while( *p == ' ' ) { p++; } } if( *p == '"' || *p == '\'' ) { quote = *p; ++p; } else { quote = ' '; } valstart = p; while( *p && *p != quote ) { ++p; } *p = '\0'; add_symvar( &global_dict, "$sec", valstart, no_subscript, 0 ); } else { add_symvar( &global_dict, "$sec", "", no_subscript, 0 );// set nullstring } gml_doc_xxx( doc_sect_gdoc ); if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } return; }
extern void gml_appendix( const gmltag * entry ) { if( blank_lines > 0 ) { set_skip_vars( NULL, NULL, NULL, 0, 0 ); // set g_blank_lines } scr_process_break(); gml_doc_xxx( doc_sect_appendix ); ProcFlags.frontm_seen = false; // no longer in FRONTM section if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } g_indent = 0; g_indentr = 0; set_h_start(); }
void gml_body( gml_tag gtag ) { gtag = gtag; if( g_blank_lines_ln > 0 ) { set_skip_vars( NULL, NULL, NULL, 0, 0 ); // set g_blank_lines } scr_process_break(); gml_doc_xxx( doc_sect_body ); ProcFlags.just_override = true; // justify for first line ?? TBD g_cur_left = g_page_left; g_cur_h_start = g_page_left + conv_hor_unit( &layout_work.p.line_indent ); ProcFlags.frontm_seen = false; // no longer in FRONTM section if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } }
extern void gml_backm( const gmltag * entry ) { if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } if( blank_lines > 0 ) { set_skip_vars( NULL, NULL, NULL, 0, 0 ); // set g_blank_lines } scr_process_break(); gml_doc_xxx( doc_sect_backm ); ProcFlags.frontm_seen = false; // no longer in FRONTM section g_cur_left = g_page_left; g_cur_h_start = g_page_left; if( layout_work.hx.hx_sect[hds_backm].header ) { start_doc_sect(); // a header is enough } g_indent = 0; g_indentr = 0; }
extern void gml_body( const gmltag * entry ) { if( blank_lines > 0 ) { set_skip_vars( NULL, NULL, NULL, 0, 0 ); // set g_blank_lines } scr_process_break(); gml_doc_xxx( doc_sect_body ); ProcFlags.just_override = true; // justify for first line ?? TBD g_cur_left = g_page_left; g_cur_h_start = g_page_left + conv_hor_unit( &layout_work.p.line_indent, g_curr_font ); ProcFlags.frontm_seen = false; // no longer in FRONTM section if( !ProcFlags.fb_document_done ) { // the very first section/page do_layout_end_processing(); } if( layout_work.hx.hx_sect[hds_body].header ) { start_doc_sect(); // a header is enough } g_indent = 0; g_indentr = 0; set_h_start(); }
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; }
static void scan_script( void ) { inputcb * cb; mac_entry * me; char * p; char * pt; int toklen; int k; bool cwfound; cb = input_cbs; p = scan_start + 1; scan_restart = scan_start; if( (*p == '*') || !strnicmp( p, "cm ", 3 ) ) { scan_start = scan_stop + 1; // .cm +++ ignore comment up to EOL return; // .* +++ ignore comment up to EOL } if( *p == SCR_char && *(p+1) == SCR_char ) { pt = token_buf; *pt++ = SCR_char; // special for ...label *pt++ = SCR_char; *pt = '\0'; me = NULL; scan_start = p + 2; toklen = 2; } else { if( *p == '\'' ) { // .' p++; ProcFlags.CW_sep_ignore = 1; } else { if( CW_sep_char == '\0') { ProcFlags.CW_sep_ignore = 1;// No separator char no split } else{ ProcFlags.CW_sep_ignore = 0; } if( *p == SCR_char ) { // .. p++; ProcFlags.macro_ignore = 1; me = NULL; } else { ProcFlags.macro_ignore = 0; } } if( ProcFlags.literal ) { // no macro or split line if literal ProcFlags.CW_sep_ignore = 1; ProcFlags.macro_ignore = 1; } if( !ProcFlags.CW_sep_ignore ) { // scan line for CW_sep_char char * pchar; pchar = search_separator( buff2, CW_sep_char ); if( pchar != NULL ) { if( *(pchar + 1) != '\0' ) { // only split if more follows split_input( buff2, pchar + 1, false );// ignore CW_sep_char } *pchar= '\0'; // delete CW_sep_char buff2_lg = strlen( buff2 ); // new length of first part } } scan_start = p; pt = token_buf; while( *p && is_macro_char( *p ) ) { // end of controlword *pt++ = tolower( *p++ ); // copy lowercase to TokenBuf } *pt = '\0'; toklen = pt - token_buf; if( *p && (*p != ' ') || toklen == 0 ) {// no valid script controlword / macro // if( !ProcFlags.literal ) { // TBD // cw_err(); // } scan_start = scan_restart; // treat as text return; } if( toklen >= MAC_NAME_LENGTH ) { *(token_buf + MAC_NAME_LENGTH) = '\0'; } if( !ProcFlags.macro_ignore ) { me = find_macro( macro_dict, token_buf ); } else { me = NULL; } } if( me != NULL ) { // macro found if( GlobalFlags.firstpass && cb->fmflags & II_research ) { if( cb->fmflags & II_macro ) { printf_research( "L%d %c%s macro found in macro %s(%d)\n\n", inc_level, SCR_char, token_buf, cb->s.m->mac->name, cb->s.m->lineno ); } else { printf_research( "L%d %c%s macro found in file %s(%d)\n\n", inc_level, SCR_char, token_buf, cb->s.f->filename, cb->s.f->lineno ); } add_SCR_tag_research( token_buf ); } add_macro_cb_entry( me, NULL ); inc_inc_level(); add_macro_parms( p ); scan_restart = scan_stop + 1; } else { // try script controlword cwfound = false; if( cb->fmflags & II_research && GlobalFlags.firstpass ) { if( cb->fmflags & II_macro ) { printf_research( "L%d %c%s CW found in macro %s(%d)\n\n", inc_level, SCR_char, token_buf, cb->s.m->mac->name, cb->s.m->lineno ); } else { printf_research( "L%d %c%s CW found in file %s(%d)\n\n", inc_level, SCR_char, token_buf, cb->s.f->filename, cb->s.f->lineno ); } add_SCR_tag_research( token_buf ); } if( toklen == SCR_KW_LENGTH ) { for( k = 0; k < SCR_TAGMAX; ++k ) { if( !strcmp( scr_tags[k].tagname, token_buf ) ) { #if 0 if( !ProcFlags.fb_document_done && scr_tags[k].cwflags & cw_o_t ) { /***************************************************/ /* if this is the first cw which produces output */ /* set page geometry and margins from layout */ /***************************************************/ do_layout_end_processing(); } #endif if( !ProcFlags.layout && (scr_tags[k].cwflags & cw_o_t) ) { /********************************************************/ /* this is the first control word which produces output */ /* start the document, the layout is done */ /* start_doc_sect() calls do_layout_end_processing() */ /********************************************************/ start_doc_sect(); } if( ProcFlags.literal ) { // .li active if( !strcmp( token_buf, "li" ) ) { // .li scan_start = p; // found, process scr_tags[k].tagproc(); } } else { scan_start = p; // script controlword found, process if( scr_tags[k].cwflags & cw_break ) { scr_process_break();// output incomplete line, if any } scr_tags[k].tagproc(); } cwfound = true; break; } } } if( !cwfound ) { cw_err(); // unrecognized control word } } scan_start = scan_restart; }
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; }