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

📄 environment.cpp

📁 FreeFem++可以生成高质量的有限元网格。可以用于流体力学
💻 CPP
字号:
// -*- Mode : c++ -*-//// SUMMARY  :      // USAGE    :        // ORG      : // AUTHOR   : Frederic Hecht// E-MAIL   : hecht@ann.jussieu.fr// /*  This file is part of Freefem++  Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.  Freefem++  is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.  You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */#include "environment.hpp"#include "iostream"#include <iostream>#include <fstream>#include <string>#include <cstring>#include <algorithm>// set in getprog-unix.hpp in Graphic dir..const char *  prognamearg=0;#ifdef PURE_WIN32#include <windows.h>#endif#ifdef HAVE_GETENV#include <stdlib.h>#endifusing namespace std;bool load(string s);const char SLACH='/';const char BACKSLACH='\\';#ifdef PURE_WIN32 const  char dirsep=BACKSLACH, dirnsep=SLACH;#else const  char dirnsep=BACKSLACH, dirsep=SLACH;#endifstring DirName(const char * f){  const char *c= strrchr(f,dirsep);  if(!c) return string("");  else return string(f,strlen(f)-strlen(c));}string TransDir(string dir){  for (size_t i=0; i<dir.size(); ++i)    if(dir[i]==dirnsep) dir[i]=dirsep;  if(dir.size()>1 && dir[dir.size()-1] != dirsep)     dir += dirsep;  return  dir;    }template<typename T> void  show(const char * s,const T & l,const char * separateur="\n"){  cout << s << * separateur;  for (typename T::const_iterator i=l.begin(); i != l.end(); i++)    cout  << * i << * separateur;  //cout << endl; }bool  EnvironmentFind(string key,string item) {   EnvironmentData::iterator ekey=ffenvironment.find(key);   if( ekey != ffenvironment.end())     {     OneEnvironmentData * pl= &ekey->second;     OneEnvironmentData::iterator i=find(pl->begin(),pl->end(),item);       return i != pl->end();     }       return false; }bool  EnvironmentClean(string key){   EnvironmentData::iterator ekey=ffenvironment.find(key);   if( ekey != ffenvironment.end())     {      OneEnvironmentData * pl= &ekey->second;      pl->clear();      return true;     }       return false; } bool EnvironmentInsert(string key,string item,string before){   bool ret=true;   OneEnvironmentData  & l = ffenvironment[key];      OneEnvironmentData::iterator i=find(l.begin(),l.end(),item);      if(i!=l.end()) {ret=false; l.erase(i);} // if existe remove   i=find(l.begin(),l.end(),before);   if(verbosity>=100) cout << " insert " << key << " " << item << " " << before << endl;   if(i == l.end() && before!="$")       l.insert(l.begin(),item); // insert in front    else       l.insert(i,item); // insert before i      return ret;  }int GetEnvironment(const string & key, string items){  if(verbosity>=100)  cout << key << " -> " << items << endl;  bool path=key.find("path")!= string::npos;  int d=0, k=0;  if(path)    items+=";;";  for (size_t  i=0;i<items.size();i++)   if(  items[i]==';')    {       string item =items.substr(d,i-d);      if(path) item=TransDir(item);      if(verbosity>=100) cout << " + " << item << endl;      if(!EnvironmentFind(key,item)) 	{	  EnvironmentInsert(key,item,"$");	  k++; 	}      d=i+1;              }     return k;   }int  readinitfile(const string & file){	string line="";	string key;	string value;	bool add=false;	ifstream f(file.c_str());	if( ! f) {		if(verbosity>=20) cout << "error opening init  file: " << file << endl;		return 0;}		char c,c1,bv=0;	int linenumber = 1;	bool inkey=false,invalue=false,cmm=false;	while (f)	{		c= f.get();		c1=f.peek();		//cout << c ;		//      if(bv)		//cerr << bv ;		//else cerr << '.';		if(c == EOF)		  break;		if(c =='\n' || c=='\r' )		  {		    linenumber++;		    line="";		    cmm = false;		  }		else 		  line+= c;		if(c=='#') cmm=true;		if(!cmm) 		  if(invalue) // get value  key [=|+= value ]		    { 		      if (bv) //  store the value			{	  			  if (! (c == bv || ( bv==' ' && isspace(c)) ) )			    {			      value+= c; // add to value			    }			  else  // end of value			    {			      bv =0; invalue=0; // fin de la value 			      if(verbosity >= 50) 				cout <<file <<":" << key << " = " << value <<endl;			      if(key=="verbosity")				verbosity=atoi(value.c_str());			      else 				{				  if( !add) 				    {EnvironmentClean(key);   				    GetEnvironment(key,value);}				  else 				    {				      bool path=key.find("path")!= string::npos;				      if(path)					EnvironmentInsert(key,TransDir(value),"$");		      				      else 					EnvironmentInsert(key,value,"$");		      				    }				  				}			      key="";			      value="";			    }			}		      else // find begin of value			{ 			  if(c=='\'' || c == '"' ) {bv = c;value="";}			  else if (! isspace(c)) {value=c;bv=' ';}			  			}		    }		  else if( inkey) 		    {		      if ( isalnum(c) ) key += c;		      else if ( c == '=') 			{ 			  inkey=false;			  invalue=true;			  add=false;			}		      else if ( c == '+' && c1=='=') 			{			  inkey=false;			  invalue=true;			  add=true;			  c1=f.get();			}		      else if (! isspace(c) ) 			break;      		    }		  else if(isalpha(c) ) 		    { inkey=1; key= c;}	}	if( inkey || invalue || bv )	  {	    cout << " error read init file : " << file << " " <<  linenumber << endl;	    cout << " line : " << line << endl;	    	    return -11;	  }	return 1;}void GetEnvironment() { char  * ff_verbosity=0,* ff_loadpath=0,* ff_incpath=0,* home=0;  string  ffpref="freefem++.pref";#ifdef HAVE_GETENV  ff_verbosity = getenv("FF_VERBOSITY");  ff_loadpath = getenv("FF_LOADPATH");  ff_incpath = getenv("FF_INCLUDEPATH");  home    = getenv("HOME");#endif#ifdef PURE_WIN32    const int LEN = 4096;  char envv[LEN];  char envl[LEN];  char envi[LEN];  char envh[LEN];    if (GetEnvironmentVariable("FF_VERBOSITY", envv, LEN) > 0)    ff_verbosity=envv;     if (GetEnvironmentVariable("FF_LOADPATH", envl, LEN) > 0)    ff_loadpath=envl;     if (GetEnvironmentVariable("FF_INCLUDEPATH", envi, LEN) > 0)    ff_incpath=envi;    if (GetEnvironmentVariable("HOMEPATH", envh, LEN) > 0)     home=envh;#endif   if ( ff_verbosity ) {     verbosity = atoi(ff_verbosity);  }#ifdef PURE_WIN32 #else  EnvironmentInsert("init-files","/etc/"+ffpref,"$");#ifdef FF_PREFIX_DIR_APPLE  EnvironmentInsert("init-files",string(FF_PREFIX_DIR_APPLE) + "/etc/" + ffpref ,"$");#endif#ifdef FF_PREFIX_DIR  EnvironmentInsert("init-files",string(FF_PREFIX_DIR) + "/etc/" + ffpref  ,"$");#endif  if(prognamearg)    {    if( strchr(prognamearg,dirsep) )      {	EnvironmentInsert("init-files",TransDir(DirName(prognamearg))+"/../etc/"+ffpref,"$");      }    }#endif  if(home) 	EnvironmentInsert("init-files",TransDir(home)+"."+ffpref,"$");  EnvironmentInsert("init-files",ffpref,"$");	  {     OneEnvironmentData  & l = ffenvironment["init-files"];    OneEnvironmentData::iterator i=l.begin();	    while( i != l.end())      {	if(verbosity>2) cout << " try initfile : " <<*i << endl; 	readinitfile(*i++);	         }  }        if ( ff_verbosity ) {     verbosity = atoi(ff_verbosity);  }  if(ff_loadpath)    GetEnvironment("loadpath",ff_loadpath);  if(ff_incpath)    GetEnvironment("includepaths",ff_incpath);  if( verbosity >2)     {      EnvironmentData::iterator loadpath=ffenvironment.find("loadpath");      EnvironmentData::iterator inc=ffenvironment.find("includepath");          if(  loadpath != ffenvironment.end()) {	show("\nload path : ",loadpath->second, "\n \t ");	cout <<"(.)"<<endl;      }      if(  inc != ffenvironment.end()) {	show("\ninclude path : ",inc->second, "\n \t ");	cout <<"(.)"<<endl;}    }  if ( ff_verbosity ) {     verbosity = atoi(ff_verbosity);    if(verbosity>2) cout << " --  verbosity is set to " << verbosity << endl;  }   }void EnvironmentLoad(){    EnvironmentData::iterator toload=ffenvironment.find("load");    if(  toload != ffenvironment.end()) 		for (OneEnvironmentData::iterator i=toload->second.begin(); i != toload->second.end(); ++i)	{	    if(verbosity) cout << "PreEnv load :"<< *i << endl;	    load(*i);	}	    } #ifdef TESTMAINlong verbosity=50; EnvironmentData  environment;int main(){  GetEnvironment();  return 0; }#endif

⌨️ 快捷键说明

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