utl_global.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 1,322 行 · 第 1/3 页
CPP
1,322 行
IDL_GlobalData::set_in_main_file (idl_bool is_in)
{
this->pd_in_main_file = is_in;
}
// Get or set stripped file name
UTL_String *
IDL_GlobalData::stripped_filename (void)
{
return this->pd_stripped_filename;
}
void
IDL_GlobalData::set_stripped_filename (UTL_String *nm)
{
if (this->pd_stripped_filename != 0)
delete this->pd_stripped_filename;
this->pd_stripped_filename = nm;
}
// Get or set cache value for argv[0]
const char *
IDL_GlobalData::prog_name (void)
{
return this->pd_prog_name;
}
void
IDL_GlobalData::set_prog_name (const char *pn)
{
this->pd_prog_name = pn;
}
// Get or set location to find C preprocessor
const char *
IDL_GlobalData::cpp_location (void)
{
return this->pd_cpp_location;
}
void
IDL_GlobalData::set_cpp_location (const char *l)
{
this->pd_cpp_location = l;
}
// Get or set IDL compiler flags
long
IDL_GlobalData::compile_flags (void)
{
return this->pd_compile_flags;
}
void
IDL_GlobalData::set_compile_flags (long cf)
{
this->pd_compile_flags = cf;
}
// Get or set BE to be used
const char *
IDL_GlobalData::be (void)
{
return this->pd_be;
}
void
IDL_GlobalData::set_be (const char *nbe)
{
this->pd_be = nbe;
}
// Get or set local escapes string. This provides additional mechanism
// to pass information to a BE.
char *
IDL_GlobalData::local_escapes (void)
{
return this->pd_local_escapes;
}
void
IDL_GlobalData::set_local_escapes (const char *e)
{
if (this->pd_local_escapes != 0)
{
delete [] this->pd_local_escapes;
}
this->pd_local_escapes = ACE::strnew (e);
}
// Get or set indent object
UTL_Indenter *
IDL_GlobalData::indent (void)
{
return this->pd_indent;
}
void
IDL_GlobalData::set_indent (UTL_Indenter *i)
{
this->pd_indent = i;
}
// Get or set indicator whether we're reading from stdin.
idl_bool
IDL_GlobalData::read_from_stdin (void)
{
return this->pd_read_from_stdin;
}
void
IDL_GlobalData::set_read_from_stdin (idl_bool r)
{
this->pd_read_from_stdin = r;
}
// Have we seen this #include file name before?
long
IDL_GlobalData::seen_include_file_before (char *n)
{
unsigned long i;
char *incl = 0;
char *tmp = n;
for (i = 0; i < this->pd_n_include_file_names; ++i)
{
incl = this->pd_include_file_names[i]->get_string ();
if (ACE_OS::strcmp (tmp, incl) == 0)
{
return seen_once[i]++;
}
}
return 0;
}
// Store the name of an #include file.
void
IDL_GlobalData::store_include_file_name (UTL_String *n)
{
UTL_String **o_include_file_names;
unsigned long o_n_alloced_file_names;
unsigned long i;
// Check if we need to store it at all or whether we've seen it already.
if (this->seen_include_file_before (n->get_string ()))
{
return;
}
// OK, need to store. Make sure there's space for one more string
if (this->pd_n_include_file_names == this->pd_n_alloced_file_names)
{
// Allocating more space.
if (this->pd_n_alloced_file_names == 0)
{
this->pd_n_alloced_file_names = INCREMENT;
ACE_NEW (this->pd_include_file_names,
UTL_String *[this->pd_n_alloced_file_names]);
}
else
{
o_include_file_names = this->pd_include_file_names;
o_n_alloced_file_names = this->pd_n_alloced_file_names;
this->pd_n_alloced_file_names += INCREMENT;
ACE_NEW (this->pd_include_file_names,
UTL_String *[this->pd_n_alloced_file_names]);
for (i = 0; i < o_n_alloced_file_names; ++i)
{
this->pd_include_file_names[i] = o_include_file_names[i];
}
delete [] o_include_file_names;
}
}
// Store it.
seen_once[this->pd_n_include_file_names] = 1;
this->pd_include_file_names[this->pd_n_include_file_names++] = n;
}
void
IDL_GlobalData::set_include_file_names (UTL_String **ns)
{
this->pd_include_file_names = ns;
}
UTL_String **
IDL_GlobalData::include_file_names (void)
{
return this->pd_include_file_names;
}
void
IDL_GlobalData::set_n_include_file_names (unsigned long n)
{
pd_n_include_file_names = n;
}
unsigned long
IDL_GlobalData::n_include_file_names (void)
{
return pd_n_include_file_names;
}
// Access methods to deal with other IDL files included in the main
// IDL file.
void
IDL_GlobalData::add_to_included_idl_files (char* file_name)
{
// Is there enough space there to store one more file.
if (this->n_included_idl_files_ == this->n_allocated_idl_files_)
{
// Allocating more space.
if (this->n_allocated_idl_files_ == 0)
{
// First time creation.
this->n_allocated_idl_files_ = INCREMENT;
ACE_NEW (this->included_idl_files_,
char *[this->n_allocated_idl_files_]);
}
else
{
// Adding more storage.
char** old_included_idl_files =
this->included_idl_files_;
size_t n_old_allocated_idl_files =
this->n_allocated_idl_files_;
this->n_allocated_idl_files_ += INCREMENT;
ACE_NEW (this->included_idl_files_,
char *[this->n_allocated_idl_files_]);
for (size_t i = 0; i < n_old_allocated_idl_files; ++i)
{
this->included_idl_files_ [i] = old_included_idl_files [i];
}
delete [] old_included_idl_files;
}
}
// Store it.
this->included_idl_files_ [this->n_included_idl_files_++] = file_name;
}
char**
IDL_GlobalData::included_idl_files (void)
{
return this->included_idl_files_;
}
size_t
IDL_GlobalData::n_included_idl_files (void)
{
return this->n_included_idl_files_;
}
// Set the number of included_idl_files. Use this carefully. This
// method is used when we validate all the #included idl files,
// against the ones that we get after preprocessing.
void
IDL_GlobalData::n_included_idl_files (size_t n)
{
this->n_included_idl_files_ = n;
}
// Validate the included idl files, somefiles might have been
// ignored by the preprocessor.
void
IDL_GlobalData::validate_included_idl_files (void)
{
// Flag to make sure we don't repeat things.
static int already_done = 0;
if (already_done == 1)
{
return;
}
already_done = 1;
// New number of included_idl_files.
size_t newj = 0;
char separator[2];
size_t n_found = 0;
# if defined (ACE_WIN32)
# define FULLPATH(full, partial, maxlen) ::_fullpath (full, partial, maxlen)
ACE_OS::strcpy (separator, "\\");
# else
# define FULLPATH(full, partial, maxlen) realpath (partial, full)
ACE_OS::strcpy (separator, "/");
# endif
size_t n_pre_preproc_includes = idl_global->n_included_idl_files ();
char **pre_preproc_includes = idl_global->included_idl_files ();
size_t n_post_preproc_includes = idl_global->n_include_file_names ();
UTL_String **post_preproc_includes = idl_global->include_file_names ();
char pre_abspath[MAXPATHLEN];
char post_abspath[MAXPATHLEN];
char **path_tmp = 0;
char *post_tmp = 0;
for (size_t j = 0; j < n_pre_preproc_includes; ++j)
{
// Check this name with the names list that we got from the
// preprocessor.
size_t valid_file = 0;
(void) FULLPATH (pre_abspath, pre_preproc_includes[j], MAXPATHLEN);
if (pre_abspath != 0)
{
for (size_t ni = 0; ni < n_post_preproc_includes; ++ni)
{
post_tmp = post_preproc_includes[ni]->get_string ();
(void) FULLPATH (post_abspath, post_tmp, MAXPATHLEN);
if (post_abspath != 0
&& ACE_OS::strcmp (pre_abspath, post_abspath) == 0)
{
FILE *test = ACE_OS::fopen (post_abspath, "r");
if (test == 0)
{
continue;
}
// This file name is valid.
valid_file = 1;
++n_found;
break;
}
}
}
if (valid_file == 0)
{
for (ACE_Unbounded_Queue_Iterator<char *>iter (
this->include_paths_
);
!iter.done ();
iter.advance ())
{
iter.next (path_tmp);
ACE_CString pre_partial (*path_tmp);
pre_partial += separator;
pre_partial += pre_preproc_includes[j];
(void) FULLPATH (pre_abspath,
ACE_const_cast (char *, pre_partial.c_str ()),
MAXPATHLEN);
if (pre_abspath != 0)
{
for (size_t m = 0; m < n_post_preproc_includes; ++m)
{
post_tmp = post_preproc_includes[m]->get_string ();
(void) FULLPATH (post_abspath, post_tmp, MAXPATHLEN);
if (post_abspath != 0
&& ACE_OS::strcmp (pre_abspath, post_abspath) == 0)
{
FILE *test = ACE_OS::fopen (post_abspath, "r");
if (test == 0)
{
continue;
}
// This file name is valid.
valid_file = 1;
++n_found;
break;
}
}
}
if (valid_file == 1)
{
break;
}
}
}
// Remove the file, if it is not valid.
if (valid_file == 0)
{
delete pre_preproc_includes[j];
pre_preproc_includes[j] = 0;
}
else
{
// File is valid.
// Move it to new index if necessary.
if (j != newj)
{
// Move to the new index position.
pre_preproc_includes[newj] =
pre_preproc_includes[j];
// Make old position 0.
pre_preproc_includes[j] = 0;
}
// Increment the new index.
newj++;
}
if (n_found == n_post_preproc_includes)
{
break;
}
}
// Now adjust the count on the included_idl_files.
idl_global->n_included_idl_files (newj);
}
void
IDL_GlobalData::set_parse_state(ParseState ps)
{
pd_parse_state = ps;
}
IDL_GlobalData::ParseState
IDL_GlobalData::parse_state()
{
return pd_parse_state;
}
/*
* Convert a PredefinedType to an ExprType
*/
AST_Expression::ExprType
IDL_GlobalData::PredefinedTypeToExprType (
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?