void gml_ul( const gmltag * entry ) { char * p; bool compact; p = scan_start; p++; while( *p == ' ' ) { p++; } scan_start = p; // over spaces if( !strnicmp( "compact", p, 7 ) ) { compact = true; scan_start = p + 7; } if( ProcFlags.need_li_lp ) { xx_nest_err( err_no_li_lp ); } gml_xl_lp_common( entry, t_UL ); nest_cb->compact = compact; nest_cb->li_number = 0; nest_cb->left_indent = conv_hor_unit( &layout_work.ul.left_indent ); nest_cb->right_indent = conv_hor_unit( &layout_work.ul.right_indent ); nest_cb->lay_tag = &layout_work.ul; nest_cb->lm = g_cur_left; nest_cb->rm = g_page_right; scan_start = scan_stop + 1; return; }
static void gml_li_sl( const gmltag * entry ) { char * p; int32_t t_left_indent_1 = 0; int32_t t_left_indent_2 = 0; int32_t t_right_indent = 0; scan_err = false; p = scan_start; if( nest_cb == NULL ) { xx_nest_err( err_li_lp_no_list ); // tag must be in a list scan_start = scan_stop + 1; return; } scr_process_break(); if( ProcFlags.need_li_lp ) { // first :li for this list set_skip_vars( &nest_cb->xl_pre_skip, NULL, NULL, 1, g_curr_font ); } else if( !nest_cb->compact ) { set_skip_vars( &((sl_lay_level *)(nest_cb->lay_tag))->skip, NULL, NULL, 1, g_curr_font ); } else { // compact set_skip_vars( NULL, NULL, NULL, 1, g_curr_font ); } ProcFlags.keep_left_margin = true; // keep special Note indent /* Use original indents, not values possibly modified by IN */ t_left_indent_1 = conv_hor_unit( &((sl_lay_level *)(nest_cb->lay_tag))->left_indent, g_curr_font ) + nest_cb->prev->left_indent + nest_cb->prev->align; t_left_indent_2 = conv_hor_unit( &((sl_lay_level *)(nest_cb->lay_tag))->left_indent, g_curr_font ); t_right_indent = -1 * conv_hor_unit( &((sl_lay_level *)(nest_cb->lay_tag))->right_indent, g_curr_font ) + nest_cb->prev->right_indent; g_cur_left = nest_cb->lm + t_left_indent_2; g_page_right = nest_cb->rm + t_right_indent; g_cur_h_start = g_cur_left; post_space = 0; ju_x_start = g_cur_h_start; g_curr_font = ((sl_lay_level *)(nest_cb->lay_tag))->font; if( *p == '.' ) p++; // over '.' while( *p == ' ' ) p++; // skip initial spaces ProcFlags.need_li_lp = false; if( *p ) { process_text( p, g_curr_font ); // if text follows } /* Set indents to their original values for the next LI */ nest_cb->left_indent = t_left_indent_1; nest_cb->right_indent = t_right_indent; scan_start = scan_stop + 1; return; }
void gml_ul( const gmltag * entry ) { bool compact; char * p; ul_lay_level * ul_layout = NULL; p = scan_start + 1; while( *p == ' ' ) { p++; } scan_start = p; // over spaces if( !strnicmp( "compact", p, 7 ) ) { compact = true; scan_start = p + 7; } else { compact = false; } if( ProcFlags.need_li_lp ) { xx_nest_err( err_no_li_lp ); } gml_xl_lp_common( t_UL ); ul_layout = layout_work.ul.first; while( (ul_layout != NULL) && (ul_cur_level < ul_layout->level) ) { ul_layout = ul_layout->next; } if( ul_layout == NULL ) { internal_err( __FILE__, __LINE__ ); } if( ul_cur_level < layout_work.ul.max_level ) { ul_cur_level++; } else { ul_cur_level = 1; } nest_cb->compact = compact; nest_cb->li_number = 0; nest_cb->left_indent = conv_hor_unit( &ul_layout->left_indent, g_curr_font ) + nest_cb->prev->left_indent + nest_cb->prev->align; nest_cb->right_indent = -1 * conv_hor_unit( &ul_layout->right_indent, g_curr_font ) + nest_cb->prev->right_indent; nest_cb->xl_pre_skip = ul_layout->pre_skip; nest_cb->lay_tag = ul_layout; nest_cb->lm = g_cur_left; nest_cb->rm = g_page_right; spacing = (int8_t) ul_layout->spacing; scan_start = scan_stop + 1; return; }
static void gml_li_sl( const gmltag * entry ) { char * p; entry = entry; scan_err = false; p = scan_start; if( nest_cb == NULL ) { xx_nest_err( err_li_lp_no_list ); // tag must be in a list scan_start = scan_stop + 1; return; } scr_process_break(); if( ProcFlags.need_li_lp ) { // first :li for this list set_skip_vars( &((sl_lay_tag *)(nest_cb->lay_tag))->pre_skip, NULL, NULL, 1, g_curr_font ); } else if( !nest_cb->compact ) { set_skip_vars( &((sl_lay_tag *)(nest_cb->lay_tag))->skip, NULL, NULL, 1, g_curr_font ); } else { // compact set_skip_vars( NULL, NULL, NULL, 1, g_curr_font ); } ProcFlags.keep_left_margin = true; // keep special Note indent g_cur_left = nest_cb->lm + nest_cb->left_indent; g_cur_h_start = g_cur_left; g_page_right = nest_cb->rm - nest_cb->right_indent; post_space = 0; g_cur_h_start = g_cur_left; ju_x_start = g_cur_h_start; spacing = ((sl_lay_tag *)(nest_cb->lay_tag))->spacing; g_curr_font = ((sl_lay_tag *)(nest_cb->lay_tag))->font; if( *p == '.' ) p++; // over '.' while( *p == ' ' ) p++; // skip initial spaces ProcFlags.need_li_lp = false; if( *p ) { process_text( p, g_curr_font ); // if text follows } scan_start = scan_stop + 1; return; }
void gml_lp( const gmltag * entry ) { char * p; su * list_skip_su; su * lp_skip_su; su * pre_skip_su; scan_err = false; p = scan_start; if( nest_cb == NULL ) { xx_nest_err( err_li_lp_no_list ); // tag must be in a list scan_start = scan_stop + 1; return; } list_skip_su = &nest_cb->xl_pre_skip; // nest_cb on entry, not LP nest_cb lp_skip_su = &layout_work.lp.pre_skip; gml_xl_lp_common( t_LP ); if( g_line_indent == 0 ) { ProcFlags.para_starting = false; // clear for this tag's first break } scr_process_break(); nest_cb->compact = false; nest_cb->li_number = 0; nest_cb->left_indent = conv_hor_unit( &layout_work.lp.left_indent, g_curr_font ); nest_cb->right_indent = -1 * conv_hor_unit( &layout_work.lp.right_indent, g_curr_font ); nest_cb->lay_tag = &layout_work.lp; nest_cb->lm = nest_cb->prev->lm + nest_cb->prev->left_indent; nest_cb->rm = nest_cb->prev->rm + nest_cb->prev->right_indent; spacing = (int8_t) layout_work.lp.spacing; ProcFlags.keep_left_margin = true; // keep special Note indent post_space = 0; if( ProcFlags.need_li_lp ) { // :LP first tag in list pre_skip_su = greater_su( lp_skip_su, list_skip_su, spacing ); } else { pre_skip_su = lp_skip_su; } set_skip_vars( pre_skip_su, NULL, &layout_work.lp.post_skip, 1, g_curr_font ); g_cur_left = nest_cb->lm + nest_cb->left_indent;// left start // possibly indent first line g_line_indent = conv_hor_unit( &(layout_work.lp.line_indent), g_curr_font ); g_cur_h_start = g_cur_left + g_line_indent; g_page_right = nest_cb->rm + nest_cb->right_indent; nest_cb->left_indent += nest_cb->prev->left_indent; nest_cb->right_indent += nest_cb->prev->right_indent; ju_x_start = g_cur_h_start; ProcFlags.need_li_lp = false; // :LI or :LP seen ProcFlags.para_starting = true; // for next break, not this tag's break if( *p == '.' ) p++; // possible tag end while( *p == ' ' ) p++; // skip initial spaces if( *p ) { process_text( p, g_curr_font ); // if text follows } scan_start = scan_stop + 1; return; }
static void gml_li_ul( const gmltag * entry ) { char * p; char bullet[3]; int32_t t_align = 0; int32_t t_left_indent_1 = 0; int32_t t_left_indent_2 = 0; int32_t t_right_indent = 0; scan_err = false; p = scan_start; if( nest_cb == NULL ) { xx_nest_err( err_li_lp_no_list ); // tag must be in a list scan_start = scan_stop + 1; return; } if( ((ul_lay_level *)(nest_cb->lay_tag))->bullet_translate ) { bullet[0] = cop_in_trans( ((ul_lay_level *)(nest_cb->lay_tag))->bullet, ((ul_lay_level *)(nest_cb->lay_tag))->bullet_font ); } else { bullet[0] = ((ul_lay_level *)(nest_cb->lay_tag))->bullet; } bullet[1] = ' '; // 1 trailing space as wgml4 does bullet[2] = 0; scr_process_break(); if( ProcFlags.need_li_lp ) { // first :li for this list set_skip_vars( &nest_cb->xl_pre_skip, NULL, NULL, 1, g_curr_font ); } else if( !nest_cb->compact ) { set_skip_vars( &((ul_lay_level *)(nest_cb->lay_tag))->skip, NULL, NULL, 1, g_curr_font ); } else { // compact set_skip_vars( NULL, NULL, NULL, 1, g_curr_font ); } g_curr_font = ((ul_lay_level *)(nest_cb->lay_tag))->bullet_font; post_space = 0; /* Use original indents, not values possibly modified by IN */ if( g_indent > 0 ) { t_left_indent_1 = conv_hor_unit( &((ul_lay_level *)(nest_cb->lay_tag))->left_indent, g_curr_font ) + nest_cb->prev->left_indent + nest_cb->prev->align; } else { t_left_indent_1 = conv_hor_unit( &((ul_lay_level *)(nest_cb->lay_tag))->left_indent, g_curr_font ) + nest_cb->prev->left_indent; } t_left_indent_2 = conv_hor_unit( &((ul_lay_level *)(nest_cb->lay_tag))->left_indent, g_curr_font ); t_right_indent = -1 * conv_hor_unit( &((ul_lay_level *)(nest_cb->lay_tag))->right_indent, g_curr_font ) + nest_cb->prev->right_indent; g_cur_left = nest_cb->lm + t_left_indent_2; g_page_right = nest_cb->rm + t_right_indent; g_cur_h_start = g_cur_left; ProcFlags.keep_left_margin = true; // keep special Note indent start_line_with_string( bullet, g_curr_font, true ); t_align = conv_hor_unit( &((ul_lay_level *)(nest_cb->lay_tag))->align, g_curr_font ); g_cur_h_start = g_cur_left + t_align; if( t_line != NULL ) { if( t_line->last != NULL ) { g_cur_left += t_line->last->width + post_space; } } post_space = 0; if( g_cur_h_start > g_cur_left ) { g_cur_left = g_cur_h_start; } g_cur_h_start = g_cur_left; ju_x_start = g_cur_h_start; g_curr_font = ((ul_lay_level *)(nest_cb->lay_tag))->font; if( *p == '.' ) p++; // over '.' while( *p == ' ' ) p++; // skip initial spaces ProcFlags.need_li_lp = false; if( *p ) { process_text( p, g_curr_font ); // if text fullows } nest_cb->align = t_align; g_cur_left = nest_cb->lm + t_left_indent_2 + nest_cb->align; /* Set indents to their original values for the next LI */ if( g_indent > 0 ) { nest_cb->left_indent = t_left_indent_1; } else { nest_cb->left_indent = t_left_indent_1 + nest_cb->prev->align; } nest_cb->right_indent = t_right_indent; scan_start = scan_stop + 1; return; }
static void gml_li_ol( const gmltag * entry ) { char charnumber[MAX_L_AS_STR]; char * p; char * pn; int32_t t_align = 0; int32_t t_left_indent_1 = 0; int32_t t_left_indent_2 = 0; int32_t t_right_indent = 0; uint32_t num_len; scan_err = false; p = scan_start; if( nest_cb == NULL ) { xx_nest_err( err_li_lp_no_list ); // tag must be in a list scan_start = scan_stop + 1; return; } t_align = conv_hor_unit( &((ol_lay_level *)(nest_cb->lay_tag))->align, g_curr_font ); nest_cb->li_number++; pn = format_num( nest_cb->li_number, charnumber, MAX_L_AS_STR, ((ol_lay_level *)(nest_cb->lay_tag))->number_style ); if( pn != NULL ) { num_len = strlen( pn ); *(pn + num_len) = ' '; // trailing space like wgml4 does *(pn + num_len + 1) = '\0'; num_len++; } else { pn = charnumber; *pn = '?'; *(pn + 1) = 0; num_len = 1; } scr_process_break(); g_curr_font = ((ol_lay_level *)(nest_cb->lay_tag))->number_font; if( ProcFlags.need_li_lp ) { // first :li for this list set_skip_vars( &nest_cb->xl_pre_skip, NULL, NULL, 1, g_curr_font ); } else if( !nest_cb->compact ) { set_skip_vars( &((ol_lay_level *)(nest_cb->lay_tag))->skip, NULL, NULL, 1, g_curr_font ); } else { // compact set_skip_vars( NULL, NULL, NULL, 1, g_curr_font ); } post_space = 0; /* Use original indents, not values possibly modified by IN */ if( g_indent > 0 ) { t_left_indent_1 = conv_hor_unit( &((ol_lay_level *)(nest_cb->lay_tag))->left_indent, g_curr_font ) + nest_cb->prev->left_indent + nest_cb->prev->align; } else { t_left_indent_1 = conv_hor_unit( &((ol_lay_level *)(nest_cb->lay_tag))->left_indent, g_curr_font ) + nest_cb->prev->left_indent; } t_left_indent_2 = conv_hor_unit( &((ol_lay_level *)(nest_cb->lay_tag))->left_indent, g_curr_font ); t_right_indent = -1 * conv_hor_unit( &((ol_lay_level *)(nest_cb->lay_tag))->right_indent, g_curr_font ) + nest_cb->prev->right_indent; g_cur_left = nest_cb->lm + t_left_indent_2; g_page_right = nest_cb->rm + t_right_indent; g_cur_h_start = g_cur_left; ProcFlags.keep_left_margin = true; // keep special Note indent start_line_with_string( charnumber, g_curr_font, true ); g_cur_h_start = g_cur_left + t_align; if( t_line != NULL ) { if( t_line->last != NULL ) { g_cur_left += t_line->last->width + post_space; } } post_space = 0; if( g_cur_h_start > g_cur_left ) { g_cur_left = g_cur_h_start; } g_cur_h_start = g_cur_left; ju_x_start = g_cur_h_start; g_curr_font = ((ol_lay_level *)(nest_cb->lay_tag))->font; if( *p == '.' ) p++; // over '.' while( *p == ' ' ) p++; // skip initial spaces ProcFlags.need_li_lp = false; // 1. item in list processed if( *p ) { process_text( p, g_curr_font ); // if text follows } nest_cb->align = t_align; /* Set indents to their original values for the next LI */ if( g_indent > 0 ) { nest_cb->left_indent = t_left_indent_1; } else { nest_cb->left_indent = t_left_indent_1 + nest_cb->prev->align; } nest_cb->right_indent = t_right_indent; scan_start = scan_stop + 1; return; }
void gml_lp( const gmltag * entry ) { char * p; su * list_skip_su; su * lp_skip_su; su * pre_skip_su; scan_err = false; p = scan_start; if( nest_cb == NULL ) { xx_nest_err( err_li_lp_no_list ); // tag must be in a list scan_start = scan_stop + 1; return; } switch( nest_cb->c_tag ) { case t_OL : list_skip_su = &((ol_lay_tag *)(nest_cb->lay_tag))->pre_skip; break; case t_SL : list_skip_su = &((sl_lay_tag *)(nest_cb->lay_tag))->pre_skip; break; case t_UL : list_skip_su = &((ul_lay_tag *)(nest_cb->lay_tag))->pre_skip; break; case t_DL : // TBD list_skip_su = &((dl_lay_tag *)(nest_cb->lay_tag))->pre_skip; break; case t_GL : // TBD list_skip_su = &((gl_lay_tag *)(nest_cb->lay_tag))->pre_skip; break; default: break; } lp_skip_su = &layout_work.lp.pre_skip; gml_xl_lp_common( entry, t_LP ); nest_cb->compact = false; nest_cb->li_number = 0; nest_cb->left_indent = conv_hor_unit( &layout_work.lp.left_indent ); nest_cb->right_indent = conv_hor_unit( &layout_work.lp.right_indent ); nest_cb->lay_tag = &layout_work.lp; nest_cb->lm = nest_cb->prev->lm + nest_cb->prev->left_indent; nest_cb->rm = nest_cb->prev->rm - nest_cb->prev->right_indent; scr_process_break(); spacing = ((lp_lay_tag *)(nest_cb->lay_tag))->spacing; ProcFlags.keep_left_margin = true; // keep special Note indent post_space = 0; if( ProcFlags.need_li_lp ) { // :LP first tag in list pre_skip_su = greater_su( lp_skip_su, list_skip_su, spacing ); } else { pre_skip_su = &((lp_lay_tag *)(nest_cb->lay_tag))->pre_skip; } set_skip_vars( NULL, pre_skip_su, &((ol_lay_tag *)(nest_cb->lay_tag))->post_skip, 1, g_curr_font ); g_cur_left = nest_cb->lm + nest_cb->left_indent;// left start // possibly indent first line g_cur_h_start = g_cur_left + conv_hor_unit( &(layout_work.lp.line_indent) ); g_page_right = nest_cb->rm - nest_cb->right_indent; ju_x_start = g_cur_h_start; if( *p == '.' ) p++; // over '.' while( *p == ' ' ) p++; // skip initial spaces ProcFlags.need_li_lp = false; // :LI or :LP seen if( *p ) { process_text( p, g_curr_font ); // if text follows } scan_start = scan_stop + 1; return; }
static void gml_li_ul( const gmltag * entry ) { char * p; char bullet[3]; entry = entry; scan_err = false; p = scan_start; if( nest_cb == NULL ) { xx_nest_err( err_li_lp_no_list ); // tag must be in a list scan_start = scan_stop + 1; return; } if( ((ul_lay_tag *)(nest_cb->lay_tag))->bullet_translate ) { bullet[0] = cop_in_trans( ((ul_lay_tag *)(nest_cb->lay_tag))->bullet, ((ul_lay_tag *)(nest_cb->lay_tag))->bullet_font ); } else { bullet[0] = ((ul_lay_tag *)(nest_cb->lay_tag))->bullet; } bullet[1] = ' '; // 1 trailing space as wgml4 does bullet[2] = 0; scr_process_break(); if( ProcFlags.need_li_lp ) { // first :li for this list set_skip_vars( &((ul_lay_tag *)(nest_cb->lay_tag))->pre_skip, NULL, NULL, 1, g_curr_font ); } else if( !nest_cb->compact ) { set_skip_vars( &((ul_lay_tag *)(nest_cb->lay_tag))->skip, NULL, NULL, 1, g_curr_font ); } else { // compact set_skip_vars( NULL, NULL, NULL, 1, g_curr_font ); } spacing = ((ul_lay_tag *)(nest_cb->lay_tag))->spacing; g_curr_font = ((ul_lay_tag *)(nest_cb->lay_tag))->bullet_font; post_space = 0; g_cur_left = nest_cb->lm + nest_cb->left_indent; g_cur_h_start = g_cur_left; g_page_right = nest_cb->rm - nest_cb->right_indent; ProcFlags.keep_left_margin = true; // keep special Note indent start_line_with_string( bullet, g_curr_font, true ); g_cur_h_start = g_cur_left + conv_hor_unit( &(((ul_lay_tag *)(nest_cb->lay_tag))->align) ); if( t_line != NULL ) { if( t_line->last != NULL ) { g_cur_left += t_line->last->width + post_space; } } post_space = 0; if( g_cur_h_start > g_cur_left ) { g_cur_left = g_cur_h_start; } g_cur_h_start = g_cur_left; ju_x_start = g_cur_h_start; spacing = ((ul_lay_tag *)(nest_cb->lay_tag))->spacing; g_curr_font = ((ul_lay_tag *)(nest_cb->lay_tag))->font; if( *p == '.' ) p++; // over '.' while( *p == ' ' ) p++; // skip initial spaces ProcFlags.need_li_lp = false; if( *p ) { process_text( p, g_curr_font ); // if text fullows } scan_start = scan_stop + 1; return; }
static void scan_gml( void ) { inputcb * cb; char * p; int toklen; int k; char csave; bool processed; gtentry * ge; // GML user tag entry mac_entry * me; // script macro for processing GML tag char linestr[MAX_L_AS_STR]; char tok_upper[TAG_NAME_LENGTH]; cb = input_cbs; p = scan_start + 1; tok_start = scan_start; while( is_id_char( *p ) && p <= scan_stop ) { // search end of TAG p++; } scan_start = p; // store argument start address toklen = p - tok_start - 1; csave = *p; *p = '\0'; if( toklen >= TAG_NAME_LENGTH ) { err_count++; // SC--009 The tagname is too long if( cb->fmflags & II_macro ) { ultoa( cb->s.m->lineno, linestr, 10 ); g_err( err_tag_name, tok_start + 1, linestr, "macro", cb->s.m->mac->name ); } else { ultoa( cb->s.f->lineno, linestr, 10 ); g_err( err_tag_name, tok_start + 1, linestr, "file", cb->s.f->filename ); } if( inc_level > 0 ) { show_include_stack(); } *p = csave; scan_start = tok_start; // process as text return; } if( GlobalFlags.firstpass && cb->fmflags & II_research ) { if( stricmp( tok_start + 1, "cmt" ) ) { // quiet for :cmt. if( cb->fmflags & II_macro ) { printf_research( "L%d %c%s tag found in macro %s(%d)\n\n", inc_level, GML_char, tok_start + 1, cb->s.m->mac->name, cb->s.m->lineno ); } else { printf_research( "L%d %c%s tag found in file %s(%d)\n\n", inc_level, GML_char, tok_start + 1, cb->s.f->filename, cb->s.f->lineno ); } } add_GML_tag_research( tok_start + 1 ); } if( ProcFlags.layout ) { ge = NULL; // no user tags within :LAYOUT } else { ge = find_tag( &tag_dict, tok_start + 1 ); } processed = false; me = NULL; if( ge != NULL ) { // GML user defined Tag found *p = csave; if( ge->tagflags & tag_off ) { // inactive, treat as text scan_start = tok_start; return; } me = find_macro( macro_dict, ge->macname ); if( me == NULL ) { err_count++; // SC--037: The macro 'xxxxxx' for the gml tag 'yyyyy' // is not defined if( cb->fmflags & II_macro ) { ultoa( cb->s.m->lineno, linestr, 10 ); g_err( err_tag_macro, ge->macname, ge->name, linestr, "macro", cb->s.m->mac->name ); } else { ultoa( cb->s.f->lineno, linestr, 10 ); g_err( err_tag_macro, ge->macname, ge->name, linestr, "file", cb->s.f->filename ); } if( inc_level > 0 ) { show_include_stack(); } *p = csave; scan_start = tok_start; // process as text return; } else { /*******************************************************************/ /* The following is to prevent an endless loop */ /* Example from ow documentation: */ /* .gt ZH1 add zh1 */ /* .gt H1 add zh1 */ /* .dm zh1 begin */ /* ... */ /* :H1 <---- overridden gml tag */ /* ... */ /* .dm zh1 end */ /* */ /* we call the predefined :H1 instead */ /*******************************************************************/ if( (cb->fmflags & II_tag) && (cb->s.m->mac == me) ) { me = NULL; } } } if( me != NULL ) { // usertag and coresponding macro ok processed = process_tag( ge, me ); } else { *p ='\0'; for( k = 0; k <= toklen; k++ ) { tok_upper[k] = toupper( *(tok_start + 1 + k) ); } tok_upper[k] = '\0'; if( ProcFlags.layout ) { // different tags within :LAYOUT for( k = 0; k < LAY_TAGMAX; ++k ) { if( toklen == lay_tags[k].taglen ) { if( !strcmp( lay_tags[k].tagname, tok_upper ) ) { *p = csave; lay_ind = -1; // process tag not attribute lay_tags[k].gmlproc( &lay_tags[k] ); processed = true; lay_ind = k; // now process attributes if any if( *scan_start == '.' ) { scan_start++; } break; } } } if( !processed ) { // check for gml only tag in :LAYOUT for( k = 0; k < GML_TAGMAX; ++k ) { if( toklen == gml_tags[k].taglen ) { if( !strcmp( gml_tags[k].tagname, tok_upper ) ) { g_err( err_gml_in_lay, gml_tags[k].tagname ); err_count++; file_mac_info(); processed = true; scan_start = scan_stop + 1; break; } } } } } else { // not within :LAYOUT for( k = 0; k < GML_TAGMAX; ++k ) { if( toklen == gml_tags[k].taglen ) { if( !strcmp( gml_tags[k].tagname, tok_upper ) ) { if( GlobalFlags.firstpass && !strcmp(tok_upper, "LAYOUT" ) && ProcFlags.fb_document_done ) { g_err( err_lay_too_late ); err_count++; file_mac_info(); processed = true; scan_start = scan_stop + 1; break; } *p = csave; if( (rs_loc == 0) && !ProcFlags.need_li_lp ) { // no restrictions: do them all gml_tags[k].gmlproc( &gml_tags[k] ); } else if( ProcFlags.need_li_lp && ((gml_tags[k].taglocs & li_lp_tag) != 0) ) { // tag is LP or LI gml_tags[k].gmlproc( &gml_tags[k] ); } else if( (gml_tags[k].taglocs & rs_loc) != 0 ) { // tag allowed in this restricted location gml_tags[k].gmlproc( &gml_tags[k] ); } else if( (gml_tags[k].tagflags & tag_is_general) != 0 ) { // tag allowed everywhere gml_tags[k].gmlproc( &gml_tags[k] ); } else { start_doc_sect(); // if not already done if( ProcFlags.need_li_lp ) { xx_nest_err( err_no_li_lp ); } else { // rs_loc > 0 g_err_tag_rsloc( rs_loc, tok_start ); } } processed = true; if( *scan_start == '.' ) { scan_start++; } break; } } } if( !processed ) { // check for layout tag in normal text for( k = 0; k < LAY_TAGMAX; ++k ) { if( toklen == lay_tags[k].taglen ) { if( !strcmp( lay_tags[k].tagname, tok_upper ) ) { g_err( err_lay_in_gml, lay_tags[k].tagname ); err_count++; file_mac_info(); processed = true; scan_start = scan_stop + 1; break; } } } } } } if( *p == '\0' ) { *p = csave; } if( !processed ) { // treat as text scan_start = tok_start; } }