コード例 #1
0
ファイル: glbanner.c プロジェクト: ABratovic/open-watcom-v2
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;
}
コード例 #2
0
ファイル: glbanreg.c プロジェクト: Ukusbobra/open-watcom-v2
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;
}