diff options
Diffstat (limited to 'ace/Svc_Conf_Lexer.cpp')
-rw-r--r-- | ace/Svc_Conf_Lexer.cpp | 624 |
1 files changed, 0 insertions, 624 deletions
diff --git a/ace/Svc_Conf_Lexer.cpp b/ace/Svc_Conf_Lexer.cpp deleted file mode 100644 index 700f07bb22f..00000000000 --- a/ace/Svc_Conf_Lexer.cpp +++ /dev/null @@ -1,624 +0,0 @@ -// $Id$ -#include "ace/Svc_Conf_Lexer.h" - -#if (ACE_USES_CLASSIC_SVC_CONF == 1) - -#if defined (ACE_USES_WCHAR) -#include "ace/Encoding_Converter.h" -#include "ace/Encoding_Converter_Factory.h" -#endif /* ACE_USES_WCHAR */ - -#include "ace/Svc_Conf_Tokens.h" -#include "ace/Recursive_Thread_Mutex.h" -#include "ace/Static_Object_Lock.h" -#include "ace/OS_NS_stdio.h" -#include "ace/OS_NS_ctype.h" -#include "ace/Guard_T.h" -#include "ace/Synch_Traits.h" -#include "ace/os_include/os_ctype.h" - -#if !defined (__GNUG__) -# include "ace/Auto_Ptr.h" -#endif - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -#define ACE_YY_BUF_SIZE 4096 -#define ACE_MAX_BYTES_PER_CHAR 4 -#define ACE_YY_CONVERSION_SPACE ACE_YY_BUF_SIZE * ACE_MAX_BYTES_PER_CHAR - -#if defined (__GNUG__) -# define ACE_TEMPORARY_STRING(X,SIZE) \ - __extension__ char X[SIZE] -#else -# define ACE_TEMPORARY_STRING(X,SIZE) \ - char* X = 0; \ - char X ## buf[ACE_YY_BUF_SIZE]; \ - ACE_Auto_Ptr<char> X ## bufp (0); \ - if (SIZE > ACE_YY_BUF_SIZE) { \ - X ## bufp.reset (new char[SIZE]); \ - X = X ## bufp.get (); \ - } \ - else { \ - X = X ## buf; \ - } -#endif /* __GNUG__ */ - -// These are states not covered by the tokens in Svc_Conf_Tokens.h -#define ACE_NO_STATE -1 -#define ACE_COMMENT 0 - -struct ace_yy_buffer_state -{ - ace_yy_buffer_state (void) - : input_ (), - index_ (0), - size_ (0), - start_ (0), - need_more_ (true), - eof_ (false), - state_ (ACE_NO_STATE), - string_start_ (0) -#if defined (ACE_USES_WCHAR) - , converter_ (0) -#endif /* ACE_USES_WCHAR */ - { - } - - ~ace_yy_buffer_state (void) - { -#if defined (ACE_USES_WCHAR) - delete converter_; -#endif /* ACE_USES_WCHAR */ - } - - // Input related - char input_[ACE_YY_CONVERSION_SPACE]; - size_t index_; - size_t size_; - size_t start_; - bool need_more_; - bool eof_; - - // Parsing related - int state_; - char string_start_; - -#if defined (ACE_USES_WCHAR) - // Code set conversion related - ACE_Encoding_Converter* converter_; -#endif /* ACE_USES_WCHAR */ -}; - -// ****************************************************************** -// Global functions -// ****************************************************************** - -int -ace_yylex (ACE_YYSTYPE *ace_yylval, void *ACE_YYLEX_PARAM) -{ - ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_RECURSIVE_MUTEX, - ace_mon, - *ACE_Static_Object_Lock::instance (), - -1)); - - return ACE_Svc_Conf_Lexer::yylex (ace_yylval, ACE_SVC_CONF_PARAM); - -} - -void -ace_yy_delete_buffer (ace_yy_buffer_state *buffer) -{ - delete buffer; -} - -// ****************************************************************** -// Inline methods -// ****************************************************************** - -inline size_t -normalize (size_t length) -{ - return (length >= ACE_MAX_BYTES_PER_CHAR ? - (length / ACE_MAX_BYTES_PER_CHAR) * ACE_MAX_BYTES_PER_CHAR : - length); -} - -// ****************************************************************** -// Static class methods -// ****************************************************************** - -int -ACE_Svc_Conf_Lexer::yylex (ACE_YYSTYPE* ace_yylval, - ACE_Svc_Conf_Param* param) -{ -#if defined (ACE_USES_WCHAR) - bool look_for_bom = false; - ACE_Encoding_Converter_Factory::Encoding_Hint hint = - ACE_Encoding_Converter_Factory::ACE_NONE; -#endif /* ACE_USES_WCHAR */ - if (param->buffer == 0) - { -#if defined (ACE_USES_WCHAR) - look_for_bom = true; -#endif /* ACE_USES_WCHAR */ - ACE_NEW_RETURN (param->buffer, - ace_yy_buffer_state, - -1); - } - - int token = ACE_NO_STATE; - do { - if (param->buffer->need_more_) - { - size_t skip_bytes = 0; - param->buffer->need_more_ = false; - size_t amount = - input (param, - param->buffer->input_ + param->buffer->size_, - normalize (ACE_YY_BUF_SIZE - - param->buffer->size_)); - if (amount == 0) - { - param->buffer->eof_ = true; - skip_bytes = param->buffer->size_; - } - else - { -#if defined (ACE_USES_WCHAR) - if (look_for_bom) - { - size_t read_more = 0; - - look_for_bom = false; - hint = locate_bom (param->buffer->input_, amount, read_more); - - if (read_more != 0) - { - input (param, - param->buffer->input_ + amount, - read_more); - ACE_OS::memmove (param->buffer->input_, - param->buffer->input_ + read_more, - amount); - } - } -#endif /* ACE_USES_WCHAR */ - skip_bytes = param->buffer->size_; - param->buffer->size_ += amount; - } - -#if defined (ACE_USES_WCHAR) - if (!convert_to_utf8 (param, skip_bytes, hint)) - { - ace_yyerror (++param->yyerrno, - param->yylineno, - "Unable to convert input stream to UTF-8"); - return ACE_NO_STATE; - } -#endif /* ACE_USES_WCHAR */ - } - - token = scan (ace_yylval, param); - } while (token == ACE_NO_STATE && param->buffer->need_more_); - - return token; -} - -size_t -ACE_Svc_Conf_Lexer::input (ACE_Svc_Conf_Param* param, - char* buf, size_t max_size) -{ - size_t result = 0; - - switch (param->type) - { - case ACE_Svc_Conf_Param::SVC_CONF_FILE: - errno = 0; - while ((result = ACE_OS::fread (buf, 1, - max_size, param->source.file)) == 0 && - ferror (param->source.file)) - { - if (errno == EINTR) - { - errno = 0; -#if !defined (ACE_LACKS_CLEARERR) - ACE_OS::clearerr (param->source.file); -#endif /* !ACE_LACKS_CLEARERR */ - } - else - { - ACE_OS::fprintf (stderr, "ERROR: input in scanner failed\n"); - ACE_OS::exit (2); - } - } - break; - case ACE_Svc_Conf_Param::SVC_CONF_DIRECTIVE: - result = ACE_OS::strlen (param->source.directive + - param->buffer->start_) * sizeof (ACE_TCHAR); - if (result != 0) - { - // Make sure that the amount we are going to copy - // fits in the buffer - if (result > max_size) - { - result = max_size; - } - ACE_OS::memcpy (buf, - param->source.directive + param->buffer->start_, - result); - param->buffer->start_ += (result / sizeof (ACE_TCHAR)); - } - break; - default: - ace_yyerror (++param->yyerrno, - param->yylineno, - "Invalid Service Configurator type in " - "ACE_Svc_Conf_Lexer::input"); - } - - return result; -} - -int -ACE_Svc_Conf_Lexer::scan (ACE_YYSTYPE* ace_yylval, - ACE_Svc_Conf_Param* param) - -{ - ace_yy_buffer_state* buffer = param->buffer; - - // If we are not currently in any state, skip over whitespace - if (buffer->state_ == ACE_NO_STATE) - { - while (buffer->index_ < buffer->size_ && - isspace (buffer->input_[buffer->index_])) - { - ++buffer->index_; - } - } - - size_t current; - size_t last = buffer->size_ + (buffer->eof_ ? 1 : 0); - for (current = buffer->index_; current < last; current++) - { - static const char* separators = " \t\r\n:*(){}"; - char c = (buffer->eof_ && current == buffer->size_ ? - '\n' : buffer->input_[current]); - switch (buffer->state_) - { - case ACE_COMMENT: - if (c == '\n') - { - buffer->state_ = ACE_NO_STATE; - buffer->index_ = current + 1; - ++param->yylineno; - } - break; - case ACE_STRING: - if (c == buffer->string_start_) - { - char* source = buffer->input_ + buffer->index_ + 1; - size_t amount = (current - buffer->index_) - 1; -#if defined (ACE_USES_WCHAR) - ACE_TCHAR target[ACE_YY_CONVERSION_SPACE] = ACE_TEXT (""); - size_t length = 0; - if (!convert_from_utf8 (buffer->converter_, - source, - amount, - target, - ACE_YY_CONVERSION_SPACE, - length)) - { - ace_yyerror (++param->yyerrno, - param->yylineno, - "Unable to convert string from UTF-8"); - return ACE_NO_STATE; - } - amount = length; -#else - char* target = source; -#endif /* ACE_USES_WCHAR */ - ace_yylval->ident_ = param->obstack.copy (target, amount); - buffer->state_ = ACE_NO_STATE; - buffer->index_ = current + 1; - return ACE_STRING; - } - break; - case ACE_NO_STATE: - if (c == '"' || c == '\'') - { - buffer->string_start_ = c; - buffer->state_ = ACE_STRING; - } - else if (c == '#') - { - buffer->state_ = ACE_COMMENT; - } - else if (ACE_OS::strchr (separators, c) != 0) - { - if (c == '\n') - { - ++param->yylineno; - } - - if (current == buffer->index_ + 1) - { - int lower = ACE_OS::ace_tolower ( - buffer->input_[current - 1]); - if (c == ':' && - (buffer->input_[current - 1] == '%' || - (lower >= 'a' && lower <= 'z'))) - { - // This is considered a path, so we need to - // skip over the ':' and go around the loop - // again - break; - } - } - - if (current == buffer->index_) - { - buffer->index_ = current + 1; - if (isspace (c)) - { - // This is an empty line. - // Let's look for something else. - break; - } - else - { - return c; - } - } - - // String from buffer->index_ to current (inclusive) - size_t size = (current - buffer->index_) + 1; - ACE_TEMPORARY_STRING (str, size); - ACE_OS::strncpy (str, buffer->input_ + buffer->index_, - size - 1); - str[size - 1] = '\0'; - - - if (ACE_OS::strcmp (str, "dynamic") == 0) - { - buffer->index_ = current; - return ACE_DYNAMIC; - } - else if (ACE_OS::strcmp (str, "static") == 0) - { - buffer->index_ = current; - return ACE_STATIC; - } - else if (ACE_OS::strcmp (str, "suspend") == 0) - { - buffer->index_ = current; - return ACE_SUSPEND; - } - else if (ACE_OS::strcmp (str, "resume") == 0) - { - buffer->index_ = current; - return ACE_RESUME; - } - else if (ACE_OS::strcmp (str, "remove") == 0) - { - buffer->index_ = current; - return ACE_REMOVE; - } - else if (ACE_OS::strcmp (str, "stream") == 0) - { - buffer->index_ = current; - return ACE_USTREAM; - } - else if (ACE_OS::strcmp (str, "Module") == 0) - { - buffer->index_ = current; - return ACE_MODULE_T; - } - else if (ACE_OS::strcmp (str, "Service_Object") == 0) - { - buffer->index_ = current; - return ACE_SVC_OBJ_T; - } - else if (ACE_OS::strcmp (str, "STREAM") == 0) - { - buffer->index_ = current; - return ACE_STREAM_T; - } - else if (ACE_OS::strcmp (str, "active") == 0) - { - buffer->index_ = current; - return ACE_ACTIVE; - } - else if (ACE_OS::strcmp (str, "inactive") == 0) - { - buffer->index_ = current; - return ACE_INACTIVE; - } - else - { - // Get the string and save it in ace_yylval - int token = ACE_IDENT; - size_t amount = size - 1; -#if defined (ACE_USES_WCHAR) - ACE_TCHAR target[ACE_YY_CONVERSION_SPACE] = ACE_TEXT (""); - size_t length = 0; - if (!convert_from_utf8 (buffer->converter_, - str, - amount, - target, - ACE_YY_CONVERSION_SPACE, - length)) - { - ace_yyerror (++param->yyerrno, - param->yylineno, - "Unable to convert " - "identifier from UTF-8"); - return ACE_NO_STATE; - } - amount = length; -#else - char* target = str; -#endif /* ACE_USES_WCHAR */ - ace_yylval->ident_ = param->obstack.copy (target, amount); - - // Determine the difference between pathname and ident - if (ACE_OS::ace_isdigit (ace_yylval->ident_[0])) - { - token = ACE_PATHNAME; - } - else - { - static const ACE_TCHAR* path_parts = - ACE_TEXT ("/\\:%.~-"); - for (const ACE_TCHAR* p = path_parts; *p != '\0'; p++) - { - if (ACE_OS::strchr (ace_yylval->ident_, *p) != 0) - { - token = ACE_PATHNAME; - break; - } - } - } - - buffer->state_ = ACE_NO_STATE; - buffer->index_ = current; - return token; - } - } - break; - default: - ace_yyerror (++param->yyerrno, - param->yylineno, - "Unexpected state in ACE_Svc_Conf_Lexer::scan"); - return ACE_NO_STATE; - } - } - - // We need more from the input source so, we will move the remainder of - // the buffer to the front and signal that we need more - if (!buffer->eof_) - { - buffer->need_more_ = true; - if (buffer->state_ == ACE_COMMENT) - { - buffer->index_ = 0; - buffer->size_ = 0; - } - else - { - buffer->size_ = current - buffer->index_; - if (buffer->size_ != 0 && buffer->index_ != 0) - ACE_OS::memmove (buffer->input_, - buffer->input_ + buffer->index_, buffer->size_); - buffer->index_ = 0; - buffer->state_ = ACE_NO_STATE; - } - } - return ACE_NO_STATE; -} - -#if defined (ACE_USES_WCHAR) - -bool -ACE_Svc_Conf_Lexer::convert_to_utf8 ( - ACE_Svc_Conf_Param* param, - size_t skip_bytes, - ACE_Encoding_Converter_Factory::Encoding_Hint hint) -{ - bool status = false; - if (param->buffer->converter_ == 0) - { - param->buffer->converter_ = - ACE_Encoding_Converter_Factory::create ( - reinterpret_cast<ACE_Byte*> (param->buffer->input_ + skip_bytes), - param->buffer->size_ - skip_bytes, - hint); - } - - if (param->buffer->converter_ != 0) - { - char target[ACE_YY_CONVERSION_SPACE] = ""; - if (param->buffer->converter_->to_utf8 ( - param->buffer->input_ + skip_bytes, - param->buffer->size_ - skip_bytes, - reinterpret_cast<ACE_Byte*> (target), - ACE_YY_CONVERSION_SPACE) == ACE_Encoding_Converter::CONVERSION_OK) - { - ACE_OS::strcpy (param->buffer->input_ + skip_bytes, target); - param->buffer->size_ = ACE_OS::strlen (target) + skip_bytes; - status = true; - } - } - - return status; -} - -bool -ACE_Svc_Conf_Lexer::convert_from_utf8 (ACE_Encoding_Converter* converter, - const char* source, - size_t source_size, - ACE_TCHAR* target, - size_t target_size, - size_t& length) -{ - if (converter != 0) - { - if (converter->from_utf8 ( - reinterpret_cast <const ACE_Byte*> (source), - source_size, - target, - target_size) != ACE_Encoding_Converter::CONVERSION_OK) - { - return false; - } - } - else - { - ACE_OS::strncpy (target, ACE_TEXT_CHAR_TO_TCHAR (source), source_size); - target[source_size] = 0; - } - - length = ACE_OS::strlen (target); - return true; -} - -ACE_Encoding_Converter_Factory::Encoding_Hint -ACE_Svc_Conf_Lexer::locate_bom (char* source, - size_t source_size, - size_t& bytes_used) -{ - struct bom { - size_t length_; - const char* data_; - ACE_Encoding_Converter_Factory::Encoding_Hint hint_; - }; - static const bom boms[] = { - { 4, "\x00\x00\xfe\xff", ACE_Encoding_Converter_Factory::ACE_UTF_32BE }, - { 4, "\xff\xfe\x00\x00", ACE_Encoding_Converter_Factory::ACE_UTF_32LE }, - { 2, "\xfe\xff", ACE_Encoding_Converter_Factory::ACE_UTF_16BE }, - { 2, "\xff\xfe", ACE_Encoding_Converter_Factory::ACE_UTF_16LE }, - { 3, "\xef\xbb\xbf", ACE_Encoding_Converter_Factory::ACE_UTF_8 }, - }; - - for (size_t i = 0; i < sizeof (boms) / sizeof (bom); i++) - { - if (source_size >= boms[i].length_) - { - if (ACE_OS::memcmp (source, - boms[i].data_, boms[i].length_) == 0) - { - bytes_used = boms[i].length_; - return boms[i].hint_; - } - } - } - - // No BOM was found - bytes_used = 0; - return ACE_Encoding_Converter_Factory::ACE_NONE; -} - -#endif /* ACE_USES_WCHAR */ - -ACE_END_VERSIONED_NAMESPACE_DECL -#endif /* ACE_USES_CLASSIC_SVC_CONF = 1 */ |