Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add functions for working with entity lumps #1673

Merged
merged 12 commits into from
Sep 5, 2022
Prev Previous commit
Next Next commit
Add standalone entity lump parser
This allows for standalone testing of the parsing component with
arbitrary entity strings.
  • Loading branch information
nosoop committed May 14, 2022
commit dbf5b006c9f6e88a743b3a106f43db3a455209b5
224 changes: 224 additions & 0 deletions tools/entlumpparser/AMBuildScript
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
import os, sys

# Simple extensions do not need to modify this file.

def ResolveEnvPath(env, folder):
if env in os.environ:
path = os.environ[env]
if os.path.isdir(path):
return path
return None

head = os.getcwd()
oldhead = None
while head != None and head != oldhead:
path = os.path.join(head, folder)
if os.path.isdir(path):
return path
oldhead = head
head, tail = os.path.split(head)

return None

def Normalize(path):
return os.path.abspath(os.path.normpath(path))

class ProgramConfig(object):
def __init__(self):
self.binaries = []
self.sm_root = None

@property
def tag(self):
if builder.options.debug == '1':
return 'Debug'
return 'Release'

def configure(self):
cxx = builder.DetectCompilers()

if builder.options.sm_path:
self.sm_root = builder.options.sm_path
if not self.sm_root or not os.path.isdir(self.sm_root):
raise Exception('Could not find a source copy of SourceMod')

if cxx.like('gcc'):
self.configure_gcc(cxx)
elif cxx.vendor == 'msvc':
self.configure_msvc(cxx)

# Optimization
if builder.options.opt == '1':
cxx.defines += ['NDEBUG']

# Debugging
if builder.options.debug == '1':
cxx.defines += ['DEBUG', '_DEBUG']

# Platform-specifics
if builder.target_platform == 'linux':
self.configure_linux(cxx)
elif builder.target_platform == 'mac':
self.configure_mac(cxx)
elif builder.target_platform == 'windows':
self.configure_windows(cxx)

# Finish up.
cxx.includes += [
os.path.join(self.sm_root, 'public'),
]

def configure_gcc(self, cxx):
cxx.defines += [
'stricmp=strcasecmp',
'_stricmp=strcasecmp',
'_snprintf=snprintf',
'_vsnprintf=vsnprintf',
'HAVE_STDINT_H',
'GNUC',
]
cxx.cflags += [
'-pipe',
'-fno-strict-aliasing',
'-Wall',
'-Werror',
'-Wno-unused',
'-Wno-switch',
'-Wno-array-bounds',
'-msse',
'-m32',
'-fvisibility=hidden',
]
cxx.cxxflags += [
'-std=c++14',
'-fno-exceptions',
'-fno-threadsafe-statics',
'-Wno-non-virtual-dtor',
'-Wno-overloaded-virtual',
'-fvisibility-inlines-hidden',
]
cxx.linkflags += ['-m32']

have_gcc = cxx.vendor == 'gcc'
have_clang = cxx.vendor == 'clang'
if cxx.version >= 'clang-3.9' or cxx.version == 'clang-3.4' or cxx.version > 'apple-clang-6.0':
cxx.cxxflags += ['-Wno-expansion-to-defined']
if cxx.version >= 'clang-3.6':
cxx.cxxflags += ['-Wno-inconsistent-missing-override']
if have_clang or (cxx.version >= 'gcc-4.6'):
cxx.cflags += ['-Wno-narrowing']
if have_clang or (cxx.version >= 'gcc-4.7'):
cxx.cxxflags += ['-Wno-delete-non-virtual-dtor']
if cxx.version >= 'gcc-4.8':
cxx.cflags += ['-Wno-unused-result']

if have_clang:
cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch']
if cxx.version >= 'apple-clang-5.1' or cxx.version >= 'clang-3.4':
cxx.cxxflags += ['-Wno-deprecated-register']
else:
cxx.cxxflags += ['-Wno-deprecated']
cxx.cflags += ['-Wno-sometimes-uninitialized']

if have_gcc:
cxx.cflags += ['-mfpmath=sse']

if builder.options.opt == '1':
cxx.cflags += ['-O3']

def configure_msvc(self, cxx):
if builder.options.debug == '1':
cxx.cflags += ['/MTd']
cxx.linkflags += ['/NODEFAULTLIB:libcmt']
else:
cxx.cflags += ['/MT']
cxx.defines += [
'_CRT_SECURE_NO_DEPRECATE',
'_CRT_SECURE_NO_WARNINGS',
'_CRT_NONSTDC_NO_DEPRECATE',
'_ITERATOR_DEBUG_LEVEL=0',
]
cxx.cflags += [
'/W3',
]
cxx.cxxflags += [
'/EHsc',
'/GR-',
'/TP',
]
cxx.linkflags += [
'/MACHINE:X86',
'kernel32.lib',
'user32.lib',
'gdi32.lib',
'winspool.lib',
'comdlg32.lib',
'advapi32.lib',
'shell32.lib',
'ole32.lib',
'oleaut32.lib',
'uuid.lib',
'odbc32.lib',
'odbccp32.lib',
]

if builder.options.opt == '1':
cxx.cflags += ['/Ox', '/Zo']
cxx.linkflags += ['/OPT:ICF', '/OPT:REF']

if builder.options.debug == '1':
cxx.cflags += ['/Od', '/RTC1']

# This needs to be after our optimization flags which could otherwise disable it.
# Don't omit the frame pointer.
cxx.cflags += ['/Oy-']

def configure_linux(self, cxx):
cxx.defines += ['_LINUX', 'POSIX']
cxx.linkflags += ['-Wl,--exclude-libs,ALL', '-lm']
if cxx.vendor == 'gcc':
cxx.linkflags += ['-static-libgcc']
elif cxx.vendor == 'clang':
cxx.linkflags += ['-lgcc_eh']

def configure_mac(self, cxx):
cxx.defines += ['OSX', '_OSX', 'POSIX']
cxx.cflags += ['-mmacosx-version-min=10.5']
cxx.linkflags += [
'-mmacosx-version-min=10.5',
'-arch', 'i386',
'-lstdc++',
'-stdlib=libstdc++',
]
cxx.cxxflags += ['-stdlib=libstdc++']

def configure_windows(self, cxx):
cxx.defines += ['WIN32', '_WINDOWS']

def Program(self, context, name):
binary = context.compiler.Program(name)
if binary.compiler.like('msvc'):
binary.compiler.linkflags.append('/SUBSYSTEM:CONSOLE')
return binary

Tool = ProgramConfig()
Tool.configure()

# Add additional buildscripts here
BuildScripts = [
'AMBuilder',
]

binary = Tool.Program(builder, 'entlump_parser')
binary.sources += [
'console_main.cpp',
os.path.join(builder.options.sm_path, 'core', 'LumpManager.cpp'),
]

binary.compiler.includes += [
os.path.join(builder.sourcePath),
os.path.join(builder.options.sm_path, 'core'),
]

builder.Add(binary)
16 changes: 16 additions & 0 deletions tools/entlumpparser/AMBuilder
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
import os

binary = Tool.Program(builder, 'entlump_parser')

binary.sources += [
'console_main.cpp',
os.path.join(builder.options.sm_path, 'core', 'LumpManager.cpp'),
]

binary.compiler.includes += [
os.path.join(builder.sourcePath),
os.path.join(builder.options.sm_path, 'core'),
]

builder.Add(binary)
16 changes: 16 additions & 0 deletions tools/entlumpparser/configure.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et:
import sys
from ambuild2 import run

# Simple extensions do not need to modify this file.

builder = run.PrepareBuild(sourcePath = sys.path[0])

builder.options.add_option('--sm-path', type=str, dest='sm_path', default=None,
help='Path to SourceMod')
builder.options.add_option('--enable-debug', action='store_const', const='1', dest='debug',
help='Enable debugging symbols')
builder.options.add_option('--enable-optimize', action='store_const', const='1', dest='opt',
help='Enable optimization')

builder.Configure()
22 changes: 22 additions & 0 deletions tools/entlumpparser/console_main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include <fstream>
#include <iostream>
#include <sstream>

#include "LumpManager.h"

int main(int argc, char *argv[]) {
if (argc < 2) {
std::cout << "Missing input file\n";
return 0;
}

const char* filepath = argv[1];

std::ifstream input(filepath, std::ios_base::binary);
std::string data((std::istreambuf_iterator<char>(input)), std::istreambuf_iterator<char>());

EntityLumpManager lumpmgr;
lumpmgr.Parse(data.c_str());

std::cout << lumpmgr.Dump() << "\n";
}