Made variable substitution recursive, so ${${foo}} will be the value of
the variable whose name is contained in foo. Added setl command to
manipulate local variables. The only other place they can be used is in
variable substitution.
buffers to be linked into execution stacks and changed aliases and script
files to be run in a new stack frame. Cbuf_Execute executes the stack from
the top down, so wait commands are handled properly.
within braces, and put support for comments back in (oops). To use math
evaluation, put a math expression inside $(). If you have spaces in your
expression, you'll need to enclose the entire thing in quotes so it doesn't
get split up into multiple tokens.
won't be processed except for escape characters, so that escaped braces
can be used within. If an uneven number of curly braces are within a
token, it will be misparsed, so escaped braces are important if you
don't want them to be considered in the parsing of the token. Ideally,
braces within quotes within braces should not need to be escaped, but this
would require a redesign of the parser to be recursive. Maybe I will do
this later.
without considering that realloc could result in dstr->str being
changed. Also made variable substitution of non-existant variables be
replaced with a null string rather than being left alone, to prevent
errors in scripts from causing weirdness as strings get passed through
the parser several times.
normal quotes and made it so executed files are always inserted into the
console buffer so that class config files in TF can use the new parser
features, even though the exec command is run in the legacy buffer
and it will get replaced with the ith argument to the alias, 0 being the
name of the alias itself. %% will get replaced by %, out of range
numbers will simply be removed, and non-numbers will be ignored.
Changed Cmd_TokenizeString to accept a flag that controls the application
of filters (tags, variables, escape characters) to the tokens and modified
a few places in the source that called it. Added a secondary command
buffer that is parsed without filters for legacy command support.
Currently, it is only used for commands stuffed into the console from the
server. It is hacky, and I hope to eventually generalize the console
interface to support any number of buffers and audit the rest of the code
to recognize it. For now, the legacy buffer at least keeps escape
character parsing from destroying info strings.
generally cleaned the parser up. If a line begins with |, it will be
stripped off by the tokenizer and no tags or escape characters will be
processed. Commands stuffed into the console from the server are prepended
with | to ensure backward compatibility. This can also be used anywhere
backward compatibility is needed, such as where info strings are stuffed
into the console, or as an alternative to using escape characters in the
entire string.
console command parser. It will eventually include html-like tags for
modifying text (gold numbers, brown characters, etc) and escaped characters.
The major differences so far are that dynamic strings are now used instead
of static buffers, and single quotes can be used to enclose tokens as
well as double quotes.
little odd:
Received signal 11, exiting...
IN_Shutdown
IN_LL_Shutdown
VID_Shutdown
Segmentation fault (core dumped)
but the core file does accurately show the error
like normal, f_skins reports the average percent fullbright for all loaded
skins, and f_skins skinname reports the fullbright percent for a signle
skin. cl_freply controls the time in seconds before another query can be
made. Set it to 0 to disable them. More queries will be added later.
The table for accessing special characters from the console has been
tweaked a bit. Expect it to get tweaked more in the future.
This required changes to the api (info_t instead of char *) but should be
a net gain in speed (not a lot, admittedly: it was pretty fast to begin
with, but this paves the way for some other changes I have in mind).
give mst_t a buffer to hold unterminated message strings
kill MSG_ReadStaticString and MSG_ReadStringLine
msg.c:
kill MSG_ReadStaticString and MSG_ReadStringLine
MSG_ReadString: implement the buffer for unterminated message strings
and update readcount on badread
cl_main.c:
go back to MSG_ReadString and fix up the resulting const char * issues
cl_parse.c:
rewrite the cl_mofake code all because of an uninitialized variable :)
sv_main.c:
use MSG_ReadString instead of MSG_ReadStringLine because
Cmd_TokenizeString really doesn't care about a terminating \n
directly into the packet data.
- change a bunch of char *'s to const char *'s for the above. Only
thing that had trouble was the cl_nofake handler, which I changed to
use a local buffer.
- add MSG_ReadStaticString which acts like the old MSG_ReadString,
specifically that it uses a static buffer and tollerates
unterminated strings.
- add a Q_strnlen function, and make strnlen use it if strnlen is
undefined.
- Add a net_svc.h and net_svc.c which will preparse svc messages into
structs, for easier handling. Currently only soundlist and
modellist are done.
segfault if your first call was with "". Probably could cause
crashes too
- add a string.c file to libQFutil, with a Q_strcasestr function,
which strcasestr is defined to if it's not already defined. (we'd
get that with glibc if we defined __USE_GNU, but we don't)
- make client_t and SV_ExtractFromUserinfo both use NAME_MAX for
their name arrays, instead of 32 for one and 80 for the other
- rewrite almost all of SV_ExtractFromUserinfo's name handling.
- \r, \n, and \t are all converted to spaces
- leading/trailing spaces are stripped
- consecutive spaces are reduced to a single space
- empty names are considered bad
- user-* nicks are considered bad (unless forced to them)
- a name containing console or admin is considered bad
- a name that already exists is considered bad
- if they have a bad name it gets forced to user-%d, where %d is
their userid
- netname in the progs is now updated properly
- name changes are always reported unless it's the initial setting,
rather than only if they're full connected and not a spectator
- finally, if the name change fails (info string exceeded), give
them the boot. (before this was only done for duplicate names)
That's about it :)
of pre-registered (Sys_RegisterShutdown) function before actually exiting
the program. This should take care of the pain when an ncurses server
crashes.
(Sys_DPrintf is new) is now used exclusively for all lib printing. Con_Init
sets the sys printf recirection to Con_Print (which has been revamped
appropriatly) and the server sets it to SV_Print (which was SV_Printf and
the new SV_Printf calls /it/). This should fix the rcon print redirection
issues.
- also added a cache_profile command, which sorts allocations into
power-of-2 sizes, then prints out how many are of that size, the
average amount they use, and the percent of total memory is used.
Also prints out totally allocated size, number of allocations, and
average per allocation.
R_MarkLights is now about 3% instead of about 15%, I've lost 8 fps on my
null GL speed test. However, R_AddDynamicLights has jumped up a bit, so I'm
wording if maybe more surfaces are being lit.
api change: Cmd_Args () now takes a parameter inidcating which arg to
start at for grabbing the un-parsed command line
qw/source/sv_ccmds.c:
implement kk's tell command and user name matching (though # is used for
the wildcard and it's still case sensitive)
everything else:
adjust for the new Cmd_Args protype
remove include of glob.h. not needed and causes win32 build to fail
plugin.c:
include compat.h and cast the return of GetProcAddress
gl_funcs.c:
fix parse error and type mismatch
qfgl_ext.c:
half re-write QFGL_ExtensionAddress to use QFGL_ProcAddress
vid_wgl.c:
fix for the new gl linking
Sys_Printf still has the format attribute. To redirect Sys_Printf, declare the
redrecting function as void (const char *, va_list) and call Sys_SetPrintf
with this function as its parameter.
way.. Sys_Printf is now Sys_StdPrintf for now. Sys_Printf is a function
pointer and will end up replacing Con_Printf as well. Names will change
to something intelligent when I'm done. Win32 is not yet touched, but I
haven't forgotten it.
The reason for this is the assumption that Con_Printf and Sys_Printf do
not overlap. The new server console WILL change that, requiring that we
change how we handle both functions. The plan: Default to using stubs
and swap them for full-featured functions on Console init which do all
the things we expect. Will also do a stderr version later.
(and thus have a new simpler PL_ObjectForKey() function to get a value for
a key). Also, you can now call PL_FreeItem() on a plitem_t to free a
property list item and all of its descendants (if it has any).
Binary plist values are still not supported.
create a field_offset macro that takes a structure type and a field and
returns the offset of the field within the structure
everything else:
use field_offset to calculate the size of variable sized structs