PHP 8.2.30
Preview: AutoGeneratedCode.h.cxxcodebuilder Size: 8.37 KB
//opt/cpanel/ea-ruby27/src/passenger-release-6.1.2/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h.cxxcodebuilder

#  Phusion Passenger - https://www.phusionpassenger.com/
#  Copyright (c) 2017-2025 Asynchronous B.V.
#
#  "Passenger", "Phusion Passenger" and "Union Station" are registered
#  trademarks of Asynchronous B.V.
#
#  Permission is hereby granted, free of charge, to any person obtaining a copy
#  of this software and associated documentation files (the "Software"), to deal
#  in the Software without restriction, including without limitation the rights
#  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#  copies of the Software, and to permit persons to whom the Software is
#  furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice shall be included in
#  all copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#  THE SOFTWARE.

require 'build/support/vendor/cxx_hinted_parser/lib/cxx_hinted_parser'

def main
  fields = parse_config_class_fields
  comment copyright_header_for(__FILE__), 1
  separator

  comment %q{
    SpawningKit/Config/AutoGeneratedCode.h is automatically generated from
    SpawningKit/Config/AutoGeneratedCode.h.cxxcodebuilder by the build system.
    It uses the comment hints from SpawningKit/Config.h.

    To force regenerating this file:
      rm -f src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h
      rake src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h
  }

  separator


  function 'inline void Passenger::SpawningKit::Config::internStrings()' do
    add_code %Q{
      size_t totalSize = 0;
      size_t tmpSize;
      char *newStorage, *pos, *end;
    }

    separator
    comment 'Calculated required storage size'
    fields.each do |field|
      case field.type
      when 'StaticString'
        add_code %Q{
          totalSize += #{field.name}.size() + 1;
        }
      when 'StringKeyTable<StaticString>'
        add_code %Q{
          {
            StringKeyTable<StaticString>::ConstIterator it(#{field.name});
            while (*it != NULL) {
              totalSize += it.getValue().size() + 1;
              it.next();
            }
          }
        }
      end
    end

    separator
    comment 'Allocate new storage'
    add_code %Q{
      newStorage = pos = new char[totalSize];
      end = newStorage + totalSize;
    }

    separator
    comment 'Fill new storage'
    fields.each do |field|
      case field.type
      when 'StaticString'
        add_code %Q{
          pos = appendData(pos, end, #{field.name});
          pos = appendData(pos, end, "\\0", 1);
        }
      when 'StringKeyTable<StaticString>'
        add_code %Q{
          {
            StringKeyTable<StaticString>::Iterator it(#{field.name});
            while (*it != NULL) {
              pos = appendData(pos, end, it.getValue());
              pos = appendData(pos, end, "\\0", 1);
              it.next();
            }
          }
        }
      end
    end

    separator
    comment 'Move over pointers to new storage'
    add_code %Q{
      pos = newStorage;
    }
    fields.each do |field|
      case field.type
      when 'StaticString'
        add_code %Q{
          tmpSize = #{field.name}.size();
          #{field.name} = StaticString(pos, tmpSize);
          pos += tmpSize + 1;
        }
        separator
      when 'StringKeyTable<StaticString>'
        add_code %Q{
          {
            StringKeyTable<StaticString>::Iterator it(#{field.name});
            while (*it != NULL) {
              tmpSize = it.getValue().size();
              it.getValue() = StaticString(pos, tmpSize);
              pos += tmpSize + 1;
              it.next();
            }
          }
        }
        separator
      end
    end

    separator
    comment 'Commit current storage'
    add_code %Q{
      storage.reset(newStorage);
    }
  end


  function 'inline bool Passenger::SpawningKit::Config::validate(vector<StaticString> &errors) const' do
    add_code %q{
      bool ok = true;
      const Config &config = *this;
    }

    separator
    excluded_field_names = []

    fields.each do |field|
      if field.metadata[:only_meaningful_if]
        meaningfulness_check = "#{field.metadata[:only_meaningful_if]} && "
      end

      if field.metadata[:require_non_empty]
        add_code %Q{
          if (#{meaningfulness_check}OXT_UNLIKELY(#{field.name}.empty())) {
            ok = false;
            errors.push_back(P_STATIC_STRING("#{key_for(field)} may not be empty"));
          }
        }
      elsif field.metadata[:require]
        add_code %Q{
          if (#{meaningfulness_check}OXT_UNLIKELY(!(#{field.metadata[:require]}))) {
            ok = false;
            errors.push_back(P_STATIC_STRING("#{key_for(field)} does not satisfy requirement: "
              #{field.metadata[:require].inspect}));
          }
        }
      else
        excluded_field_names << field.name
      end
    end

    separator
    comment "Excluded:\n\n#{excluded_field_names.join("\n")}"
    separator
    add_code %Q{
      return ok;
    }
  end


  function 'inline Json::Value Passenger::SpawningKit::Config::getConfidentialFieldsToPassToApp() const' do
    add_code %q{
      Json::Value doc;
      const Config &config = *this;
    }

    separator

    excluded_field_names = []
    fields.each do |field|
      if field.metadata[:pass_during_handshake]
        setter_code = %Q{
          doc["#{key_for(field)}"] = #{value_expression_for(field)};
        }
        if field.metadata[:only_meaningful_if] || field.metadata[:only_pass_during_handshake_if]
          conditions = [
            field.metadata[:only_meaningful_if],
            field.metadata[:only_pass_during_handshake_if]
          ].compact
          add_code %Q[
            if (#{conditions.join(" && ")}) {
          ]
          indent do
            add_code(setter_code)
          end
          add_code %Q[
            }
          ]
        else
          add_code(setter_code)
        end
      else
        excluded_field_names << field.name
      end
    end

    separator
    comment "Excluded:\n\n#{excluded_field_names.join("\n")}"
    separator
    add_code %q{
      return doc;
    }
  end

  function 'inline Json::Value Passenger::SpawningKit::Config::getNonConfidentialFieldsToPassToApp() const' do
    add_code %q{
      Json::Value doc;
      const Config &config = *this;
    }

    separator

    excluded_field_names = []
    fields.each do |field|
      if field.metadata[:pass_during_handshake]
        if field.metadata[:non_confidential]
          setter_code = %Q{
            doc["#{key_for(field)}"] = #{value_expression_for(field)};
          }
        else
          setter_code = %Q{
            doc["#{key_for(field)}"] = "<SECRET>";
          }
        end
        if field.metadata[:only_meaningful_if] || field.metadata[:only_pass_during_handshake_if]
          conditions = [
            field.metadata[:only_meaningful_if],
            field.metadata[:only_pass_during_handshake_if]
          ].compact
          add_code %Q[
            if (#{conditions.join(" && ")}) {
          ]
          indent do
            add_code(setter_code)
          end
          add_code %Q[
            }
          ]
        else
          add_code(setter_code)
        end
      else
        excluded_field_names << field.name
      end
    end

    separator
    comment "Excluded:\n\n#{excluded_field_names.join("\n")}"
    separator
    add_code %q{
      return doc;
    }
  end
end

def key_for(field)
  key = field.metadata[:pass_during_handshake]
  if key.is_a?(String)
    key
  else
    field.name.gsub(/([A-Z])/, '_\1').downcase
  end
end

def value_expression_for(field)
  case field.type
  when 'StaticString'
    "#{field.name}.toString()"
  when 'int', 'unsigned int', 'bool'
    field.name
  when 'StringKeyTable<StaticString>'
    "tableToJson(#{field.name})"
  else
    raise "Unsupported field type '#{field.type}' for field #{field.name}"
  end
end

def parse_config_class_fields
  config_h = File.dirname(__FILE__) + '/../Config.h'
  parser = CxxHintedParser::Parser.load_file(config_h).parse
  parser.structs['Config']
end

main

Directory Contents

Dirs: 0 × Files: 2

Name Size Perms Modified Actions
10.82 KB lrw-r--r-- 2026-01-27 23:50:52
Edit Download
8.37 KB lrw-r--r-- 2026-01-27 23:50:52
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).