|      1 /* | 
        | 
|      2  *	botc source code | 
        | 
|      3  *	Copyright (C) 2012 Santeri `Dusk` Piippo | 
        | 
|      4  *	All rights reserved. | 
        | 
|      5  *	 | 
        | 
|      6  *	Redistribution and use in source and binary forms, with or without | 
        | 
|      7  *	modification, are permitted provided that the following conditions are met: | 
        | 
|      8  *	 | 
        | 
|      9  *	1. Redistributions of source code must retain the above copyright notice, | 
        | 
|     10  *	   this list of conditions and the following disclaimer. | 
        | 
|     11  *	2. Redistributions in binary form must reproduce the above copyright notice, | 
        | 
|     12  *	   this list of conditions and the following disclaimer in the documentation | 
        | 
|     13  *	   and/or other materials provided with the distribution. | 
        | 
|     14  *	3. Neither the name of the developer nor the names of its contributors may | 
        | 
|     15  *	   be used to endorse or promote products derived from this software without | 
        | 
|     16  *	   specific prior written permission. | 
        | 
|     17  *	4. Redistributions in any form must be accompanied by information on how to | 
        | 
|     18  *	   obtain complete source code for the software and any accompanying | 
        | 
|     19  *	   software that uses the software. The source code must either be included | 
        | 
|     20  *	   in the distribution or be available for no more than the cost of | 
        | 
|     21  *	   distribution plus a nominal fee, and must be freely redistributable | 
        | 
|     22  *	   under reasonable conditions. For an executable file, complete source | 
        | 
|     23  *	   code means the source code for all modules it contains. It does not | 
        | 
|     24  *	   include source code for modules or files that typically accompany the | 
        | 
|     25  *	   major components of the operating system on which the executable file | 
        | 
|     26  *	   runs. | 
        | 
|     27  *	 | 
        | 
|     28  *	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
        | 
|     29  *	AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
        | 
|     30  *	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
        | 
|     31  *	ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | 
        | 
|     32  *	LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
        | 
|     33  *	CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
        | 
|     34  *	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
        | 
|     35  *	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
        | 
|     36  *	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
        | 
|     37  *	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
        | 
|     38  *	POSSIBILITY OF SUCH DAMAGE. | 
        | 
|     39  */ | 
        | 
|     40  | 
        | 
|     41 #define __STRINGTABLE_CXX__ | 
        | 
|     42 #include <stdio.h> | 
        | 
|     43 #include <stdlib.h> | 
        | 
|     44 #include <string.h> | 
        | 
|     45 #include "common.h" | 
        | 
|     46 #include "bots.h" | 
        | 
|     47 #include "stringtable.h" | 
        | 
|     48  | 
        | 
|     49 // ============================================================================ | 
        | 
|     50 // Initializes the string table | 
        | 
|     51 void InitStringTable() { | 
        | 
|     52 	// Zero out everything first. | 
        | 
|     53 	for (unsigned int a = 0; a < MAX_LIST_STRINGS; a++) | 
        | 
|     54 		for (unsigned int b = 0; b < MAX_STRING_LENGTH; b++) | 
        | 
|     55 			g_StringTable[a][b] = 0; | 
        | 
|     56 } | 
        | 
|     57  | 
        | 
|     58 // ============================================================================ | 
        | 
|     59 // Potentially adds a string to the table and returns the index of it. | 
        | 
|     60 unsigned int PushToStringTable (char* s) { | 
        | 
|     61 	// Must not be too long. | 
        | 
|     62 	if (strlen (s) >= MAX_STRING_LENGTH) | 
        | 
|     63 		error ("string `%s` too long (%d characters max)\n", s, strlen (s)); | 
        | 
|     64 	 | 
        | 
|     65 	// Find a free slot in the table.  | 
        | 
|     66 	unsigned int a; | 
        | 
|     67 	for (a = 0; a < MAX_LIST_STRINGS; a++) { | 
        | 
|     68 		// String is already in the table, thus return it. | 
        | 
|     69 		if (!strcmp (s, g_StringTable[a])) | 
        | 
|     70 			return a; | 
        | 
|     71 		 | 
        | 
|     72 		// String is empty, thus it's free. | 
        | 
|     73 		if (!strlen (g_StringTable[a])) | 
        | 
|     74 			break; | 
        | 
|     75 	} | 
        | 
|     76 	 | 
        | 
|     77 	// no free slots! | 
        | 
|     78 	if (a == MAX_LIST_STRINGS) | 
        | 
|     79 		error ("too many strings defined!\n"); | 
        | 
|     80 	 | 
        | 
|     81 	// Determine the length | 
        | 
|     82 	size_t l1 = strlen (s); | 
        | 
|     83 	size_t l2 = MAX_LIST_STRINGS - 1; | 
        | 
|     84 	size_t len = (l1 < l2) ? l1 : l2; | 
        | 
|     85 	 | 
        | 
|     86 	// Now, dump the string into the slot | 
        | 
|     87 	strncpy (g_StringTable[a], s, len); | 
        | 
|     88 	g_StringTable[a][len] = 0; | 
        | 
|     89 	 | 
        | 
|     90 	return a; | 
        | 
|     91 } | 
        | 
|     92  | 
        | 
|     93 // ============================================================================ | 
        | 
|     94 // Counts the amount of strings in the table. | 
        | 
|     95 unsigned int CountStringTable () { | 
        | 
|     96 	unsigned int count = 0; | 
        | 
|     97 	for (unsigned int a = 0; a < MAX_LIST_STRINGS; a++) { | 
        | 
|     98 		if (!strlen (g_StringTable[a])) | 
        | 
|     99 			break; | 
        | 
|    100 		else | 
        | 
|    101 			count++; | 
        | 
|    102 	} | 
        | 
|    103 	return count; | 
        | 
|    104 } | 
        |