void add_to_sysdir( char * name, char char_val ) { symsub * dictval; find_symvar( &sys_dict, name, no_subscript, &dictval); *(dictval->value) = char_val; }
static char * subst_1var( char * pout, char * pvar, size_t len ) { sub_index var_ind; symvar symvar_entry; symsub * symsubval; int rc; char * pchar; ProcFlags.suppress_msg = true; scan_err = false; pchar = scan_sym( pvar, &symvar_entry, &var_ind ); ProcFlags.suppress_msg = false; if( !scan_err ) { if( symvar_entry.flags & local_var ) { // lookup var in dict rc = find_symvar_l( &input_cbs->local_dict, symvar_entry.name, var_ind, &symsubval ); } else { rc = find_symvar( &global_dict, symvar_entry.name, var_ind, &symsubval ); } if( rc == 2 ) { pchar = symsubval->value; while( *pchar ) { *pout++ = *pchar++; } } } *pout = '\0'; return( pout ); }
char *scr_single_func_e( char * in, char * end, char * * result ) { char * pchar; sub_index var_ind; symvar symvar_entry; symsub * symsubval; int rc; end = end; pchar = scan_sym( in + 3 + (*(in + 3) == '&'), &symvar_entry, &var_ind ); if( symvar_entry.flags & local_var ) { // lookup var in dict rc = find_symvar_l( &input_cbs->local_dict, symvar_entry.name, var_ind, &symsubval ); } else { rc = find_symvar( &global_dict, symvar_entry.name, var_ind, &symsubval ); } if( rc == 2 ) { **result = '1'; // exists } else { **result = '0'; // does not exist } *result += 1; **result = '\0'; if( *pchar == '.' ) { pchar++; // skip optional terminating dot } ProcFlags.substituted = true; // something changed return( pchar ); }
char *scr_single_func_w( char * in, char * end, char * * result ) { char * pchar; sub_index var_ind; symvar symvar_entry; symsub * symsubval; int rc; int len; uint32_t width; if( *(in + 3) == '&' ) { // symbol name pchar = scan_sym( in + 4, &symvar_entry, &var_ind ); if( symvar_entry.flags & local_var ) { // lookup var in dict rc = find_symvar_l( &input_cbs->local_dict, symvar_entry.name, var_ind, &symsubval ); } else { rc = find_symvar( &global_dict, symvar_entry.name, var_ind, &symsubval ); } if( rc == 2 ) { width = cop_text_width( symsubval->value, strlen( symsubval->value ), g_curr_font); } else { /*******************************************************************/ /* for undefined variable calc length of name, & and perhaps * */ /*******************************************************************/ width = cop_text_width( symvar_entry.name, strlen( symvar_entry.name ), g_curr_font ) + wgml_fonts[g_curr_font].width_table['&']; if( symvar_entry.flags & local_var ) { // add width of * width += wgml_fonts[g_curr_font].width_table['*']; } } } else { // string pchar = in + 3; len = 0; while( !((*pchar == ' ') || (*pchar == '.') || (pchar == end)) ) { len++; pchar++; } width = cop_text_width( in + 3, len, g_curr_font ); } len = width; width = (width * CPI + g_resh / 2) / g_resh; sprintf( *result, "%d", width ); #if 0 // perhaps as debug output sprintf( *result + strlen( *result ), " %d", len ); #endif *result += strlen( *result ); **result = '\0'; if( *pchar == '.' ) { pchar++; // skip optional terminating dot } ProcFlags.substituted = true; // something changed return( pchar ); }
char *scr_single_func_sS( char * in, char * end, char * * result, char fun ) { char * pchar; sub_index var_ind; symvar symvar_entry; symsub * symsubval; int rc; char * pval; **result = function_escape; // insert function code in buffer *result += 1; **result = fun; *result += 1; if( *(in + 3) == '&' ) { // symbol name pchar = scan_sym( in + 4, &symvar_entry, &var_ind ); if( symvar_entry.flags & local_var ) { // lookup var in dict rc = find_symvar_l( &input_cbs->local_dict, symvar_entry.name, var_ind, &symsubval ); } else { rc = find_symvar( &global_dict, symvar_entry.name, var_ind, &symsubval ); } if( rc == 2 ) { pval = symsubval->value; // variable found } else { pval = symvar_entry.name; // not found use variable name } while( *pval ) { **result = *pval++; *result += 1; } } else { // string pchar = in + 3; while( !((*pchar == ' ') || (*pchar == '.') || (pchar == end)) ) { **result = *pchar++; *result += 1; } } **result = function_escape; // insert function code in buffer *result += 1; **result = fun | 0x01; // function end *result += 1; **result = '\0'; if( *pchar == '.' ) { pchar++; // skip optional terminating dot } ProcFlags.substituted = true; // something changed return( pchar ); }
char *scr_single_func_l( char * in, char * end, char * * result ) { char * pchar; sub_index var_ind; symvar symvar_entry; symsub * symsubval; int rc; int len; if( *(in + 3) == '&' ) { // symbol name pchar = scan_sym( in + 4, &symvar_entry, &var_ind ); if( symvar_entry.flags & local_var ) { // lookup var in dict rc = find_symvar_l( &input_cbs->local_dict, symvar_entry.name, var_ind, &symsubval ); } else { rc = find_symvar( &global_dict, symvar_entry.name, var_ind, &symsubval ); } if( rc == 2 ) { sprintf( *result, "%d", strlen( symsubval->value ) ); } else { sprintf( *result, "%d", strlen( symvar_entry.name ) ); } } else { // string pchar = in + 3; len = 0; while( !((*pchar == ' ') || (*pchar == '.') || (pchar == end)) ) { len++; pchar++; } sprintf( *result, "%d", len ); } *result += strlen( *result ); **result = '\0'; if( *pchar == '.' ) { pchar++; // skip optional terminating dot } ProcFlags.substituted = true; // something changed return( pchar ); }
static void prep_date_line( text_line *p_line, const char *p ) { text_chars * curr_t; uint32_t h_left; uint32_t h_right; symsub * subdate; int rc; h_left = g_page_left + conv_hor_unit( &layout_work.date.left_adjust ); h_right = g_page_right - conv_hor_unit( &layout_work.date.right_adjust ); if( *p ) { curr_t = alloc_text_chars( p, strlen( p ), g_curr_font ); } else { rc = find_symvar( &global_dict, "date", no_subscript, &subdate ); curr_t = alloc_text_chars( subdate->value, strlen( subdate->value ), g_curr_font ); } curr_t->count = len_to_trail_space( curr_t->text, curr_t->count ); curr_t->count = intrans( curr_t->text, curr_t->count, g_curr_font ); curr_t->width = cop_text_width( curr_t->text, curr_t->count, g_curr_font ); while( curr_t->width > (h_right - h_left) ) { // too long for line if( curr_t->count < 2) { // sanity check break; } curr_t->count -= 1; // truncate text curr_t->width = cop_text_width( curr_t->text, curr_t->count, g_curr_font ); } p_line->first = curr_t; p_line->last = curr_t; curr_t->x_address = h_left; if( layout_work.date.page_position == pos_center ) { if( h_left + curr_t->width < h_right ) { curr_t->x_address += (h_right - h_left - curr_t->width) / 2; } } else if( layout_work.date.page_position == pos_right ) { curr_t->x_address = h_right - curr_t->width; } ju_x_start = curr_t->x_address; return; }
static void content_reg( banner_lay_tag * ban ) { text_chars * curr_t; char * pbuf; symsub * symsubval; int k; int rc; switch( ban->region->contents.content_type ) { case string_content: pbuf = mem_alloc( buf_size ); *pbuf = '\0'; if( ban->region->script_format ) { /***************************************************************/ /* substitute variables and create text_chars instances */ /***************************************************************/ for( k = 0; k < 3; ++k ) { if( ban->region->script_region[k].string != NULL ) { substitute_vars( pbuf, ban->region->script_region[k].string, ban->region->script_region[k].len ); if( *pbuf ) { curr_t = alloc_text_chars( pbuf, strlen( pbuf ), ban->region->font ); /***************************************************/ /* use font 0 for width calculation */ /* even if another font is used for banregion */ /* to get the same result as wgml4 TBD */ /***************************************************/ curr_t->width = cop_text_width( curr_t->text, curr_t->count, 0 ); // ban->region->font ); reg_text[k] = curr_t; } } } } else { // no script format only normal string with perhaps vars substitute_vars( pbuf, ban->region->contents.string, strlen( ban->region->contents.string ) ); if( *pbuf ) { curr_t = alloc_text_chars( pbuf, strlen( pbuf ), ban->region->font ); /***********************************************************/ /* is font 0 used for width calc? TBD */ /***********************************************************/ curr_t->width = cop_text_width( curr_t->text, curr_t->count, ban->region->font ); if( ban->region->region_position == pos_left ) { reg_text[0] = curr_t; } else if( ban->region->region_position == pos_center ) { reg_text[1] = curr_t; } else if( ban->region->region_position == pos_right ) { reg_text[2] = curr_t; } else { reg_text[0] = curr_t; // position left if unknown } } } mem_free( pbuf ); break; case author_content : rc = find_symvar( &global_dict, "$author", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "author", 6, ban->region->font ); } break; case bothead_content : rc = find_symvar( &global_dict, "$bothead", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "bothead", 7, ban->region->font ); } break; case date_content : rc = find_symvar( &global_dict, "$date", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "date", 4, ban->region->font ); } break; case docnum_content : rc = find_symvar( &global_dict, "$docnum", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "docnum", 6, ban->region->font ); } break; case head0_content : rc = find_symvar( &global_dict, "$head0", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head0", 5, ban->region->font ); } break; case head1_content : rc = find_symvar( &global_dict, "$head1", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head1", 5, ban->region->font ); } break; case head2_content : rc = find_symvar( &global_dict, "$head2", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head2", 5, ban->region->font ); } break; case head3_content : rc = find_symvar( &global_dict, "$head3", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head3", 5, ban->region->font ); } break; case head4_content : rc = find_symvar( &global_dict, "$head4", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head4", 5, ban->region->font ); } break; case head5_content : rc = find_symvar( &global_dict, "$head5", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head5", 5, ban->region->font ); } break; case head6_content : rc = find_symvar( &global_dict, "$head6", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "head6", 5, ban->region->font ); } break; case headnum0_content : rc = find_symvar( &global_dict, "$hnum0", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum0", 5, ban->region->font ); } break; case headnum1_content : rc = find_symvar( &global_dict, "$hnum1", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum1", 5, ban->region->font ); } break; case headnum2_content : rc = find_symvar( &global_dict, "$hnum2", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum2", 5, ban->region->font ); } break; case headnum3_content : rc = find_symvar( &global_dict, "$hnum3", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum3", 5, ban->region->font ); } break; case headnum4_content : rc = find_symvar( &global_dict, "$hnum4", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum4", 5, ban->region->font ); } break; case headnum5_content : rc = find_symvar( &global_dict, "$hnum5", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum5", 5, ban->region->font ); } break; case headnum6_content : rc = find_symvar( &global_dict, "$hnum6", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "hnum6", 5, ban->region->font ); } break; case headtext0_content : rc = find_symvar( &global_dict, "$htext0", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext0", 5, ban->region->font ); } break; case headtext1_content : rc = find_symvar( &global_dict, "$htext1", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext1", 5, ban->region->font ); } break; case headtext2_content : rc = find_symvar( &global_dict, "$htext2", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext2", 5, ban->region->font ); } break; case headtext3_content : rc = find_symvar( &global_dict, "$htext3", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext3", 5, ban->region->font ); } break; case headtext4_content : rc = find_symvar( &global_dict, "$htext4", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext4", 5, ban->region->font ); } break; case headtext5_content : rc = find_symvar( &global_dict, "$htext5", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext5", 5, ban->region->font ); } break; case headtext6_content : rc = find_symvar( &global_dict, "$htext6", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "htext6", 5, ban->region->font ); } break; case pgnuma_content : rc = find_symvar( &global_dict, "$pgnuma", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnuma", 6, ban->region->font ); } break; case pgnumad_content : rc = find_symvar( &global_dict, "$pgnumad", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumad", 7, ban->region->font ); } break; case pgnumc_content : rc = find_symvar( &global_dict, "$pgnumc", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumc", 6, ban->region->font ); } break; case pgnumcd_content : rc = find_symvar( &global_dict, "$pgnumcd", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumcd", 7, ban->region->font ); } break; case pgnumr_content : rc = find_symvar( &global_dict, "$pgnumr", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumr", 6, ban->region->font ); } break; case pgnumrd_content : rc = find_symvar( &global_dict, "$pgnumrd", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "pgnumrd", 7, ban->region->font ); } break; case sec_content : rc = find_symvar( &global_dict, "$sec", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "sec", 3, ban->region->font ); } break; case stitle_content : rc = find_symvar( &global_dict, "$stitle", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "stitle", 6, ban->region->font ); } break; case title_content : rc = find_symvar( &global_dict, "$title", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "title", 6, ban->region->font ); } break; case time_content : rc = find_symvar( &global_dict, "$time", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "time", 4, ban->region->font ); } break; case tophead_content : rc = find_symvar( &global_dict, "$tophead", no_subscript, &symsubval ); if( rc == 2 ) { curr_t = alloc_text_chars( symsubval->value, strlen( symsubval->value ), ban->region->font ); } else { curr_t = alloc_text_chars( "tophead", 7, ban->region->font ); } break; case no_content : // empty region curr_t = NULL; // curr_t = alloc_text_chars( "no content", 10, ban->region->font ); break; default: // the other possible banner region values are TBD curr_t = alloc_text_chars( "Dummy region", 12, ban->region->font ); break; } if( curr_t == NULL ) { /* do nothing */ } else { if( ban->region->contents.content_type != string_content ) { /***********************************************************/ /* is font 0 used for width calc? TBD */ /***********************************************************/ curr_t->width = cop_text_width( curr_t->text, curr_t->count, ban->region->font ); if( ban->region->region_position == pos_left ) { reg_text[0] = curr_t; } else if( ban->region->region_position == pos_center ) { reg_text[1] = curr_t; } else if( ban->region->region_position == pos_right ) { reg_text[2] = curr_t; } else { reg_text[0] = curr_t; // position left if invalid } } } return; }
static condcode scr_veclp( parm parms[MAX_FUN_PARMS], size_t parmcount, char * * result, int32_t ressize ) { char * pneedle; char * pneedlend; char * phay; char * phayend; int rc; int index; int hay_len; int needle_len; char c; sub_index var_ind; symvar symvar_entry; symsub * symsubval; symvar * psymvar; bool suppress_msg; ressize = ressize; if( parmcount != 2 ) { return( neg ); } pneedle = parms[0].a; pneedlend = parms[0].e; unquote_if_quoted( &pneedle, &pneedlend ); needle_len = pneedlend - pneedle + 1; // needle length phay = parms[1].a; phayend = parms[1].e; unquote_if_quoted( &phay, &phayend ); hay_len = phayend - phay + 1; // haystack length rc = 0; scan_err = false; index = 0; if( (hay_len > 0) || // not null string (needle_len > 0) ) { // needle not null suppress_msg = ProcFlags.suppress_msg; ProcFlags.suppress_msg = true; scan_err = false; c = *(phayend + 1); *(phayend + 1) = '\0'; scan_sym( phay, &symvar_entry, &var_ind ); *(phayend + 1) = c; ProcFlags.suppress_msg = suppress_msg;; if( !scan_err ) { if( symvar_entry.flags & local_var ) { // lookup var in dict rc = find_symvar_l( &input_cbs->local_dict, symvar_entry.name, var_ind, &symsubval ); } else { rc = find_symvar( &global_dict, symvar_entry.name, var_ind, &symsubval ); } if( rc > 0 ) { // variable found psymvar = symsubval->base; if( psymvar->flags & subscripted ) { c = *(pneedlend + 1); *(pneedlend + 1) = '\0'; // make nul delimited for( symsubval = psymvar->subscripts; symsubval != NULL; symsubval = symsubval->next ) { if( !strcmp( symsubval->value, pneedle ) ) { index = symsubval->subscript; if( vec_pos ) { break;// finished for vec_pos, go for veclastpos } } } *(pneedlend + 1) = c; } } } } *result += sprintf( *result, "%d", index ); return( pos ); }
void gml_docnum( const gmltag * entry ) { char * p; doc_element * cur_el; text_line * p_line; int8_t d_spacing; font_number font_save; int32_t rc; symsub * docnumval; if( !((ProcFlags.doc_sect == doc_sect_titlep) || (ProcFlags.doc_sect_nxt == doc_sect_titlep)) ) { g_err( err_tag_wrong_sect, entry->tagname, ":TITLEP section" ); err_count++; show_include_stack(); } if( ProcFlags.docnum_tag_seen ) { // only one DOCNUM tag allowed xx_line_err( err_2nd_docnum, buff2 ); } ProcFlags.docnum_tag_seen = true; p = scan_start; if( *p && *p == '.' ) p++; // over . to docnum while( *p == ' ' ) { // over WS to attribute p++; } rc = find_symvar( &sys_dict, "$docnum", no_subscript, &docnumval ); if( *p ) { // docnum specified strcpy_s( docnumval->value, 60, p ); } else { *(docnumval->value) = 0; } start_doc_sect(); // if not already done p_line = alloc_text_line(); p_line->line_height = wgml_fonts[layout_work.docnum.font].line_height; prep_docnum_line( p_line, docnumval->value ); d_spacing = layout_work.titlep.spacing; font_save = g_curr_font; g_curr_font = layout_work.docnum.font; /************************************************************/ /* pre_skip is treated as pre_top_skip because it is */ /* always used at the top of the page, despite the docs */ /************************************************************/ set_skip_vars( NULL, &layout_work.docnum.pre_skip, NULL, d_spacing, g_curr_font ); cur_el = alloc_doc_el( el_text ); cur_el->blank_lines = g_blank_lines; g_blank_lines = 0; cur_el->depth = p_line->line_height + g_spacing; cur_el->subs_skip = g_subs_skip; cur_el->top_skip = g_top_skip; cur_el->element.text.overprint = ProcFlags.overprint; ProcFlags.overprint = false; cur_el->element.text.spacing = g_spacing; cur_el->element.text.first = p_line; ProcFlags.skips_valid = false; p_line = NULL; insert_col_main( cur_el ); g_curr_font = font_save; scan_start = scan_stop + 1; }
bool resolve_symvar_functions( char * buf ) { static const char ampchar = '&'; inp_line * in_wk; char * workb; char * pw; char * pwend; char * p2; char * pchar; char * varstart; sub_index var_ind; symvar symvar_entry; symsub * symsubval; size_t buf_lg; int rc; bool functions_found; bool anything_substituted; char * var_unresolved; // ptr for resume search char * var_unresolved2;// ptr for resume search ProcFlags.substituted = false; ProcFlags.unresolved = false; if( NULL == strchr( buf, ampchar ) ) { // look for & in buffer return( false ); // no ampchar found, nothing to resolve } anything_substituted = false; var_unresolved = NULL; var_unresolved2 = NULL; functions_found = false; in_wk = mem_alloc( sizeof( inp_line ) + buf_size );// allocate workbuffer in_wk->next = NULL; workb = in_wk->value; // allocate workbuffer do { // until no more substitutions strcpy( workb, buf ); // copy input buffer buf_lg = strlen( buf ); pwend = workb + buf_lg - 1; if( var_unresolved == NULL ) { pw = workb; p2 = buf; } else { pw = workb + (var_unresolved2 - buf); p2 = var_unresolved2; } varstart = NULL; anything_substituted |= ProcFlags.substituted; ProcFlags.substituted = false; pchar = strchr( workb, ampchar ); // look for & in buffer while( pchar != NULL ) { // & found if( *(pchar + 1) == ' ' ) { // not a symbol substition or function pchar = strchr( pchar + 1, ampchar ); // look for next & in buffer continue; } while( pw < pchar ) { // copy all data preceding & *p2++ = *pw++; } buf_lg = strlen( buf ); if( isalpha( *(pchar + 1) ) && *(pchar + 2) == '\'' && *(pchar + 3) > ' ' ) { // not for .if '&*' eq '' .th ... // only .if '&x'foo' eq '' .th char * * ppval = &p2; /***********************************************************/ /* Some single letter functions are resolved here: */ /* */ /* functions used within the OW doc build system: */ /* &e' existance of variable 0 or 1 */ /* &l' length of variable content */ /* or if undefined variable length of name */ /* &u' upper */ /* */ /* &s' subscript */ /* &S' superscript */ /* */ /* other single letter functions are not used AFAIK */ /* */ /***********************************************************/ if( GlobalFlags.firstpass && input_cbs->fmflags & II_research ) { add_single_func_research( pchar + 1 ); } pw = scr_single_funcs( pchar, pwend, ppval ); pchar = strchr( pw, ampchar ); // look for next & in buffer continue; } if( *(pchar + 1) == '\'' ) {// perhaps a multi letter function char * pf; char * * ppval = &p2; int32_t valsize = buf_size - (p2 - buf); pf = pchar + 2; while( is_function_char( *pf ) ) { pf++; } if( *pf == '(' ) {// &'xyz( is start of multi char function /***********************************************************/ /* Some multi letter functions are resolved here: */ /* */ /* functions used within the OW doc build system: */ /* */ /* &'delstr( &'d2c( &'index( */ /* &'insert( &'left( &'length( */ /* &'lower( &'min( &'pos( */ /* &'right( &'strip( &'substr( */ /* &'subword( &'translate( &'upper( */ /* &'veclastpos( &'vecpos( &'word( */ /* &'wordpos( &'words( */ /* */ /* Others are recognized but not processed */ /* &'c2x( is used for test output */ /***********************************************************/ pw = scr_multi_funcs( pchar, pwend, ppval, valsize ); pchar = strchr( pw, ampchar );// look for next & in buffer continue; } *p2++ = *pw++; // copy & pchar = strchr( pw, ampchar ); // look for next & in buffer continue; // and ignore this &... for now } /***************************************************************/ /* & is neither start of single char function */ /* nor start of multi char function */ /* */ /* & is probably start of a variable */ /***************************************************************/ varstart = pw; // remember start of var pw++; // over & ProcFlags.suppress_msg = true; scan_err = false; pchar = scan_sym( pw, &symvar_entry, &var_ind ); if( scan_err && *pchar == '(' ) { // problem with subscript if( var_unresolved == NULL ) { ProcFlags.unresolved = true; var_unresolved = varstart; var_unresolved2 = p2; } else { if( var_unresolved != varstart ) { ProcFlags.unresolved = true; } } p2 += pchar - varstart; pw = pchar; pchar = strchr( pw, ampchar ); // look for next & in buffer continue; } ProcFlags.suppress_msg = false; if( symvar_entry.flags & local_var ) { // lookup var in dict rc = find_symvar_l( &input_cbs->local_dict, symvar_entry.name, var_ind, &symsubval ); } else { rc = find_symvar( &global_dict, symvar_entry.name, var_ind, &symsubval ); } if( rc == 2 ) { // variable found + resolved ProcFlags.substituted = true; if( !ProcFlags.CW_sep_ignore && symsubval->value[0] == CW_sep_char && symsubval->value[1] != CW_sep_char ) { // split record at control word separator // if variable starts with SINGLE cw separator // and ignore cw separator if( buf != buff2 ) { // splitting input if not outermost buffer ++++ TBD // needed ??? g_suicide(); } if( *pchar == '.' ) { pchar++; // skip optional terminating dot } *p2 = '\0'; split_input_var( buf, pchar, &symsubval->value[1], true ); pw = pwend + 1; // stop substitution for this record varstart = NULL; break; } else { pw = symsubval->value; if( symsubval->value[0] == CW_sep_char && symsubval->value[1] == CW_sep_char ) { pw++; // skip 1 CW_sep_char } strcpy( p2, pw ); // copy value p2 += strlen(pw); if( *pchar == '.' ) { pchar++; // skip optional terminating dot } pw = pchar; } } else { // variable not found if( (symvar_entry.flags & local_var ) // local var not found ) { if( (symvar_entry.name[0] == '\0') && (*pchar == ampchar) ) { // only &* as var name // followed by another var if( var_unresolved == NULL ) { ProcFlags.unresolved = true; var_unresolved = varstart; var_unresolved2 = p2; } else { if( var_unresolved != varstart ) { ProcFlags.unresolved = true; } } pw = varstart; while( pw < pchar ) { // treat var name as text *p2++ = *pw++; // and copy } continue; // pchar points already to next & } else { // replace not found local var by nullstring ProcFlags.substituted = true; if( *pchar == '.' ) { pchar++; // skip optional terminating dot } pw = pchar; } } else { // global var not found // .. or local var outside of macro /*******************************************************/ /* keep trying for constructs such as */ /* */ /* .se prodgml = "Open Watcom GML" */ /* .se name = "GML" */ /* */ /* My name is &prod&name..! */ /* */ /* to become */ /* */ /* My name is Open Watcom GML! */ /* */ /* This does not work for local variables, as these are*/ /* replaced by nullstring if not found */ /* My name is &*prod&*name..! */ /* will become */ /* My name is ! */ /*******************************************************/ if( var_unresolved == NULL ) { ProcFlags.unresolved = true; var_unresolved = varstart; var_unresolved2 = p2; } else { if( var_unresolved != varstart ) { ProcFlags.unresolved = true; } } pw = varstart; if( *pchar == '.' ) { pchar++; // copy terminating dot, too } while( pw < pchar ) { // treat var name as text *p2++ = *pw++; // and copy } } } pchar = strchr( pw, ampchar ); // look for next & in buffer } // while & found while( pw <= pwend) { // copy remaining input *p2++ = *pw++; } *p2 = 0; // terminate string } while( ProcFlags.unresolved && ProcFlags.substituted ); anything_substituted |= ProcFlags.substituted; mem_free( in_wk ); // free workbuffer return( anything_substituted ); }
void ixdump( ix_h_blk * dict ) { ix_h_blk * ixh1; ix_h_blk * ixh2; ix_h_blk * ixh3; char letter[2]; if( dict == NULL ) { // empty dict nothing to do return; } letter[0] = 0; letter[1] = 0; ixh1 = dict; find_symvar( &sys_dict, "$ixref", no_subscript, &ixrefval); out_msg( ".IX . DUMP print the index structure --- still nearly dummy!\n" ); while( ixh1 != NULL ) { // level 1 if( letter[0] != toupper( *(ixh1->ix_term) ) ) { letter[0] = toupper( *(ixh1->ix_term) ); ix_out_cr(); ix_out( letter, 1 ); ix_out_cr(); ix_out_cr(); } if( ixh1->prt_term == NULL ) { ix_out( ixh1->ix_term, 1 ); } else { ix_out( ixh1->prt_term, 1 ); } ix_out_pagenos( ixh1->entry, 1 ); ixh2 = ixh1->lower; while( ixh2 != NULL ) { // level 2 if( ixh2->prt_term == NULL ) { ix_out( ixh2->ix_term, 2 ); } else { ix_out( ixh2->prt_term, 2 ); } ix_out_pagenos( ixh2->entry, 2 ); ixh3 = ixh2->lower; while( ixh3 != NULL ) { // level 3 if( ixh3->prt_term == NULL ) { ix_out( ixh3->ix_term, 3 ); } else { ix_out( ixh3->prt_term, 3 ); } ix_out_pagenos( ixh3->entry, 3 ); if( ixh3->lower != NULL ) {// this is error TBD ix_h_blk * ixhp = ixh3->lower; ix_out( "lower 3 nn\n", 0); while( ixhp != NULL ) { // level 4 if( ixhp->prt_term == NULL ) { ix_out( ixhp->ix_term, 4 ); } else { ix_out( ixhp->prt_term, 4 ); } ix_out_pagenos( ixhp->entry, 4 ); ixhp = ixhp->next; } } ixh3 = ixh3->next; } ixh2 = ixh2->next; } ixh1 = ixh1->next; } ix_out_cr(); out_msg( ".IX . DUMP print the index structure --- still nearly dummy!\n" ); ix_out_cr(); wng_count++; }
static void gen_index( void ) { char buffer[11]; char letter[2]; ix_h_blk * ixh1; ix_h_blk * ixh2; ix_h_blk * ixh3; symsub * ixrefval; // &sysixref value if( index_dict == NULL ) return; // no index_dict, no INDEX scr_process_break(); // flush any pending text start_doc_sect(); letter[0] = 0; letter[1] = 0; ixh1 = index_dict; find_symvar( &sys_dict, "$ixref", no_subscript, &ixrefval); while( ixh1 != NULL ) { // level 1 if( letter[0] != toupper( *(ixh1->ix_term) ) ) { letter[0] = toupper( *(ixh1->ix_term) ); process_text( letter, g_curr_font ); scr_process_break(); // flush letter heading } if( ixh1->prt_term == NULL ) { process_text( ixh1->ix_term, g_curr_font ); } else { process_text( ixh1->prt_term, g_curr_font ); } if( ixh1->entry->entry_typ >= pgstring ) { // 'pageno' is text process_text( ixh1->entry->page_text, g_curr_font ); } else { // 'pageno' is numeric ultoa( ixh1->entry->page_no, &buffer, 10 ); process_text( buffer, g_curr_font ); } ixh2 = ixh1->lower; while( ixh2 != NULL ) { // level 2 if( ixh2->prt_term == NULL ) { process_text( ixh2->ix_term, g_curr_font ); } else { process_text( ixh2->prt_term, g_curr_font ); } if( ixh2->entry->entry_typ >= pgstring ) { // 'pageno' is text process_text( ixh2->entry->page_text, g_curr_font ); } else { // 'pageno' is numeric ultoa( ixh2->entry->page_no, &buffer, 10 ); process_text( buffer, g_curr_font ); } ixh3 = ixh2->lower; while( ixh3 != NULL ) { // level 3 if( ixh3->prt_term == NULL ) { process_text( ixh3->ix_term, g_curr_font ); } else { process_text( ixh3->prt_term, g_curr_font ); } if( ixh3->entry->entry_typ >= pgstring ) { // 'pageno' is text process_text( ixh3->entry->page_text, g_curr_font ); } else { // 'pageno' is numeric ultoa( ixh3->entry->page_no, &buffer, 10 ); process_text( buffer, g_curr_font ); } if( ixh3->lower != NULL ) {// this is error TBD ix_h_blk * ixhp = ixh3->lower; process_text( "lower 3 nn\n", g_curr_font ); while( ixhp != NULL ) { // level 4 if( ixhp->prt_term == NULL ) { process_text( ixhp->ix_term, g_curr_font ); } else { process_text( ixhp->prt_term, g_curr_font ); } if( ixhp->entry->entry_typ >= pgstring ) { // 'pageno' is text process_text( ixhp->entry->page_text, g_curr_font ); } else { // 'pageno' is numeric ultoa( ixhp->entry->page_no, &buffer, 10 ); process_text( buffer, g_curr_font ); } ixhp = ixhp->next; } } ixh3 = ixh3->next; } ixh2 = ixh2->next; } ixh1 = ixh1->next; } }