void SemOS2WriteMenu( WResID *name, ResMemFlags flags, FullMenuOS2 *menu, YYTOKENTYPE tokentype, uint_32 codepage ) /***********************************************************************/ { ResLocation loc; int error; int err_code; tokentype = tokentype; if( !ErrorHasOccured ) { loc.start = SemStartResource(); error = SemOS2WriteSubMenu( menu, &err_code, codepage ); if( error ) { err_code = LastWresErr(); goto OutputWriteError; } loc.len = SemEndResource( loc.start ); SemAddResourceFree( name, WResIDFromNum( OS2_RT_MENU ), flags, loc ); } else { RCFREE( name ); } SemOS2FreeSubMenu( menu ); return; OutputWriteError: RcError( ERR_WRITTING_RES_FILE, CurrResFile.filename, strerror( err_code ) ); ErrorHasOccured = TRUE; SemOS2FreeSubMenu( menu ); return; }
static bool SemOS2WriteSubMenu( FullMenuOS2 *submenu, int *err_code, uint_32 codepage ) /******************************************************************/ { int count = 0; bool error; FullMenuItemOS2 *curritem; MenuHeaderOS2 head; if( ErrorHasOccured ) { return( false ); } head.Size = SemOS2CalcSubMenuSize( submenu, &count ); head.Codepage = codepage; head.Class = 4; head.NumItems = count; error = ResOS2WriteMenuHeader( &head, CurrResFile.handle ); if( error ) { ErrorHasOccured = true; return( error ); } if( submenu == NULL ) { return( error ); } error = false; for( curritem = submenu->head; curritem != NULL && !error; curritem = curritem->next ) { if( !ErrorHasOccured ) { error = SemOS2WriteMenuItem( curritem, err_code ); if( !error && (curritem->item.ItemStyle & OS2_MIS_SUBMENU) ) { error = SemOS2WriteSubMenu( curritem->submenu, err_code, codepage ); } } } if( error ) { ErrorHasOccured = true; } return( error ); }