⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfg_contents.cpp

📁 FDMP the body of the kernel, the Information-Technology Promotion Agency (IPA) adopted by the unexpl
💻 CPP
字号:
/*
 *  TOPPERS/FDMP Kernel
 *      Toyohashi Open Platform for Embedded Real-Time Systems/
 *      Function Distributed Multiprocessor Kernel
 *
 *  Copyright (C) 2005 by Takagi Nobuhisa
 * 
 *  忋婰挊嶌尃幰偼丆埲壓偺 (1)乣(4) 偺忦審偐丆Free Software Foundation 
 *  偵傛偭偰岞昞偝傟偰偄傞 GNU General Public License 偺 Version 2 偵婰
 *  弎偝傟偰偄傞忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃傾
 *  傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
 *  棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
 *  (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
 *      尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
 *      僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
 *  (2) 杮僜僼僩僂僃傾傪丆儔僀僽儔儕宍幃側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
 *      梡偱偒傞宍偱嵞攝晍偡傞応崌偵偼丆嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡
 *      幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰
 *      偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
 *  (3) 杮僜僼僩僂僃傾傪丆婡婍偵慻傒崬傓側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
 *      梡偱偒側偄宍偱嵞攝晍偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙
 *      偲丏
 *    (a) 嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊
 *        嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
 *    (b) 嵞攝晍偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆TOPPERS僾儘僕僃僋僩偵
 *        曬崘偡傞偙偲丏
 *  (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
 *      奞偐傜傕丆忋婰挊嶌尃幰偍傛傃TOPPERS僾儘僕僃僋僩傪柶愑偡傞偙偲丏
 * 
 *  杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偍
 *  傛傃TOPPERS僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
 *  娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
 *  愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
 * 
 */

/*
 *  toppers/itron/fdmp/cfg_contents.cpp
 */
#include "toppers/itron/fdmp/cfg_contents.hpp"
#include "toppers/itron/fdmp/class_id.hpp"
#include "toppers/itron/static_api.hpp"
#include "toppers/itron/include.hpp"
#include "toppers/parser.hpp"
#include "toppers/text.hpp"
#include "toppers/reporter.hpp"
#include <map>
#include <algorithm>
#include <iterator>
#include <sstream>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/filesystem/exception.hpp>

namespace toppers
{
  namespace itron
  {
    namespace fdmp
    {

      /*!
       *  儅儖僠僾儘僙僢僒岦偗僇乕僱儖偵懳偡傞 do_classify 娭悢偱偼丄儘乕僇儖僋儔僗乮 cfg_group
       *  偲偟偰娗棟乯傪僋儔僗偛偲偵巇暘偗偟丄僋儔僗ID斣崋傪妱晅偗傑偡丅
       *  偦偺屻丄僋儔僗偛偲偵弌椡愭僨傿儗僋僩儕傪嶌惉偟丄"class_id.h"傪惗惉偟傑偡丅
       */
      const boost::shared_ptr<std::vector<boost::shared_ptr<itron::cfg_contents> > > cfg_contents::do_classify( bool ucn, codeset_t codeset ) const
      {
        typedef std::vector<boost::shared_ptr<itron::cfg_contents> > vector_t;

        // 尰忬偱偼僋儔僗亖儘乕僇儖僋儔僗偲偟偰張棟
        // 懠偺僋儔僗偵偮偄偰偼巇條枹掕偺偨傔丄摿偵懳墳偼峴傢側偄丅
        typedef std::map<std::string, cfg_group::object_container > map_t;

        boost::shared_ptr<vector_t> v( new vector_t );
        map_t m;
        class_id cls_id;

        // 暘嶶掕媊偝傟偨僋儔僗傪儅乕僕
        // 拲) 偙偺帪揰偱偼婛偵儅乕僕偝傟偰偄傞偼偢偱偁傞偑擮偺偨傔
        for ( group_container::const_iterator iter( groups().begin() ), last( groups().end() ); iter != last; ++iter )
        {
          boost::shared_ptr<cfg_group> group( *iter );
          std::string class_name( group->name() );
          std::copy( group->objects().begin(), group->objects().end(), std::back_inserter( m[class_name] ) );
        }

        // 僋儔僗奜僆僽僕僃僋僩孮偺庢傝弌偟
        map_t::iterator miter( m.find( "" ) );
        cfg_group::object_container globals;
        if ( miter != m.end() )
        {
          globals = miter->second;
          m.erase( miter );
        }

        // ID斣崋偺妱晅偗
        for ( map_t::iterator iter( m.begin() ), last( m.end() ); iter != last; ++iter )
        {
          // 僋儔僗奜僆僽僕僃僋僩偺儅乕僕
          std::copy( globals.begin(), globals.end(), std::back_inserter( iter->second ) ); 

          if ( !kernel_object::assign_id( iter->second.begin(), iter->second.end() ) )
          {
            v.reset();
            return v;
          }
        }

        // "class_id.h"偺弌椡
        for ( map_t::const_iterator iter( m.begin() ), last( m.end() ); iter != last; ++iter )
        {
          group_container groups;
          boost::shared_ptr<cfg_group> g( new cfg_group );

          g->objects( iter->second );
          groups.push_back( g );
          boost::shared_ptr<itron::cfg_contents> contents( new cfg_contents( iter->first, ucn, codeset ) );
          contents->groups( groups );
          v->push_back( boost::shared_ptr<itron::cfg_contents>( contents ) );

          std::string class_name( iter->first );
          try
          {
            boost::filesystem::path dir( class_name, boost::filesystem::native );
            boost::filesystem::create_directory( dir );
          }
          catch ( boost::filesystem::filesystem_error& )
          {
            toppers::fatal( _( "cannot make directory `%1%\'" ) % class_name );
          }
          cls_id.load( contents );
        }
        cls_id.save();
        return v;
      }

      bool cfg_contents::do_parse( text::const_iterator& next, text::const_iterator last, bool ucn, codeset_t codeset )
      {
        text::const_iterator iter( next );
        while ( iter != last )
        {
          using namespace boost::spirit;
          parse_info<text::const_iterator> info;
          std::string kernel_class;
          std::string class_name;

          // 僋儔僗奜偺惷揑API暲傃偺夝愅乮尰帪揰偱偼"INCLUDE"偺傒懳墳乯
          boost::shared_ptr<cfg_group> g1( new cfg_group );
          text::const_iterator i( iter );
          static_api api;
          if ( api.parse( i, last, ucn, codeset ) )
          {
            boost::shared_ptr<kernel_object> obj( include::build( api, g1->objects() ) );
            if ( !!obj )
            {
              groups().push_back( g1 );
              iter = i;
            }
          }
          if ( iter == last )
          {
            break;
          }

          // 乽 local_class 僋儔僗柤 { 乿晹暘偺夝愅
          info = boost::spirit::parse( iter, last,
                      lexeme_d[
                        c_ident_p[ assign_a( kernel_class ) ] >> space_p >>
                        c_ident_p[ assign_a( class_name ) ]
                      ] >> '{',
                      space_p
                    );
          if ( !info.hit )
          {
            continue;
//            error( get_text_line( info.stop ), _( "syntax error" ) );
//            return false;
          }
          iter = info.stop;

          // 僋儔僗撪偺惷揑API暲傃偺夝愅
          boost::shared_ptr<cfg_group> g2;
          bool new_group = true;
          for ( group_container::const_iterator iter2( groups().begin() ), last2( groups().end() ); iter2 != last2; ++iter2 )
          {
            if ( ( *iter2 )->name() == class_name && ( *iter2 )->group_type() == kernel_class )
            {
              g2 = *iter2;
              new_group = false;
              break;
            }
          }
          if ( new_group )
          {
            g2.reset( new cfg_group( class_name, kernel_class ) );
          }
          if ( !g2->parse( iter, last, ucn, codeset ) )
          {
            return false;
          }
          
          // 乽 } 乿晹暘偺夝愅
          info = boost::spirit::parse( iter, last, ch_p( '}' ), space_p );
          if ( !info.hit )
          {
            error( get_text_line( info.stop ), _( "missing `}\'" ) );
            return false;
          }
          iter = info.stop;

          if ( new_group )
          {
            groups().push_back( g2 );
          }
        }
        next = iter;
        return true;
      }

    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -