void lay_ebanner( const gmltag * entry ) { banner_lay_tag * banwk; region_lay_tag * reg; ProcFlags.lay_xxx = el_zero; // banner no longer active if( !GlobalFlags.firstpass ) { scan_start = scan_stop + 1; eat_lay_sub_tag(); return; // process during first pass only } if( ProcFlags.banner ) { // are we inside banner ProcFlags.banner = false; lay_banner_end_prepare(); // if not yet done if( banner_delete_req ) { // delete request /* While the documentation requires the banner regions to be * deleted first, wgml 4.0 does not. It will delete a banner even * though the banner regions still exist. */ if( del_ban != NULL ) { while( del_ban->region != NULL) { reg = del_ban->region; del_ban->region = del_ban->region->next; mem_free( reg ); reg = NULL; } if( prev_ban != NULL ) { prev_ban->next = del_ban->next; } else { layout_work.banner = del_ban->next; // delete 1st banner } mem_free( del_ban ); del_ban = NULL; } } else { banwk = mem_alloc( sizeof( banner_lay_tag ) ); memcpy( banwk, curr_ban, sizeof( banner_lay_tag ) ); /***************************************************************************/ /* Adding banner to the existing banners either as first or last in chain */ /* Both give different order than wgml 4.0 */ /* This can be seen by :CONVERT output, sooooooo ... TBD */ /* If it really matters, more research has to be done */ /***************************************************************************/ #if 1 if( layout_work.banner == NULL ) { layout_work.banner = banwk; } else { curr_ban = layout_work.banner; while( curr_ban->next != NULL ) { // add at end of chain curr_ban = curr_ban->next; } curr_ban->next = banwk; } #else banwk->next = layout_work.banner; // add as first element layout_work.banner = banwk; #endif curr_ban = NULL; } } else { g_err( err_no_lay, &(entry->tagname[1]), entry->tagname ); err_count++; file_mac_info(); } scan_start = scan_stop + 1; return; }
void lay_banregion( const gmltag * entry ) { char * p; condcode cc; int k; lay_att curr; att_args l_args; bool cvterr; p = scan_start; cvterr = false; if( !GlobalFlags.firstpass ) { scan_start = scan_stop + 1; eat_lay_sub_tag(); return; // process during first pass only } if( ProcFlags.lay_xxx != el_banregion ) { if( ProcFlags.lay_xxx == el_banner ) { lay_banner_end_prepare(); } ProcFlags.lay_xxx = el_banregion; init_banregion_wk( &wk ); } else { if( !strnicmp( ":banregion", buff2, sizeof( ":banregion" ) ) ) { err_count++; g_err( err_nested_tag, entry->tagname ); file_mac_info(); while( !ProcFlags.reprocess_line ) { eat_lay_sub_tag(); if( strnicmp( ":ebanregion", buff2, sizeof( ":ebanregion" ) ) ) { ProcFlags.reprocess_line = false;// not :ebanregion, go on } } return; } } cc = get_lay_sub_and_value( &l_args ); // get att with value while( cc == pos ) { cvterr = true; for( k = 0; k < att_count; k++ ) { curr = banregion_att[k]; if( !strnicmp( att_names[curr], l_args.start[0], l_args.len[0] ) ) { p = l_args.start[1]; if( count[k] ) { cvterr = 1; // attribute specified twice } else { count[k] += 1; sum_count++; switch( curr ) { case e_indent: cvterr = i_space_unit( p, curr, &wk.indent ); break; case e_hoffset: cvterr = i_space_unit( p, curr, &wk.hoffset ); break; case e_width: cvterr = i_space_unit( p, curr, &wk.width ); break; case e_voffset: cvterr = i_space_unit( p, curr, &wk.voffset ); break; case e_depth: cvterr = i_space_unit( p, curr, &wk.depth ); break; case e_font: cvterr = i_font_number( p, curr, &wk.font ); if( wk.font >= wgml_font_cnt ) wk.font = 0; break; case e_refnum: cvterr = i_int8( p, curr, &wk.refnum ); break; case e_region_position: cvterr = i_page_position( p, curr, &wk.region_position ); break; case e_pouring: cvterr = i_pouring( p, curr, &wk.pouring ); break; case e_script_format: cvterr = i_yes_no( p, curr, &wk.script_format ); break; case e_contents: if( l_args.quoted ) { wk.contents.content_type = string_content; cvterr = i_xx_string( p, curr, wk.contents.string ); } else { cvterr = i_content( p, curr, &wk.contents ); } break; default: out_msg( "WGML logic error.\n"); cvterr = true; break; } } if( cvterr ) { // there was an error err_count++; g_err( err_att_val_inv ); file_mac_info(); } break; // break out of for loop } } cc = get_lay_sub_and_value( &l_args ); // get att with value } scan_start = scan_stop + 1; return; }