core/smn_string.cpp
author Borja Ferrer <faluco@alliedmods.net>
Sat Dec 23 02:20:53 2006 +0000 (2006-12-23)
changeset 225 dd5851605e26
child 226 4663ea3fc2d3
permissions -rw-r--r--
IPlugin context pointer is passed now to natives
Added basic string natives
Added floating point natives
     1 #include "sm_platform.h"
     2 #include <ctype.h>
     3 #include <string.h>
     4 #include "sp_vm_api.h"
     5 
     6 using namespace SourcePawn;
     7 
     8 const char *stristr(const char *str, const char *substr)
     9 {
    10 	if (!*substr)
    11 	{
    12 		return ((char *)str);
    13 	}
    14 
    15 	char *needle = (char *)substr;
    16 	char *prevloc = (char *)str;
    17 	char *haystack = (char *)str;
    18 
    19 	while (*haystack)
    20 	{
    21 		if (tolower(*haystack) == tolower(*needle))
    22 		{
    23 			haystack++;
    24 			if (!*++needle)
    25 			{
    26 				return prevloc;
    27 			}
    28 		} else {
    29 			haystack = ++prevloc;
    30 			needle = (char *)substr;
    31 		}
    32 	}
    33 
    34 	return NULL;
    35 }
    36 
    37 inline const char *_strstr(const char *str, const char *substr)
    38 {
    39 #ifdef PLATFORM_WINDOWS
    40 	return strstr(str, substr);
    41 #elif PLATFORM_LINUX
    42 	return (const char *)strstr(str, substr);
    43 #endif
    44 }
    45 
    46 /*********************************************
    47 *                                            *
    48 * STRING MANIPULATION NATIVE IMPLEMENTATIONS *
    49 *                                            *
    50 *********************************************/
    51 
    52 
    53 static cell_t sm_strlen(IPluginContext *pCtx, const cell_t *params)
    54 {
    55 	char *str;
    56 	pCtx->LocalToString(params[1], &str);
    57 
    58 	return strlen(str);
    59 }
    60 
    61 static cell_t sm_contain(IPluginContext *pCtx, const cell_t *params)
    62 {
    63 	typedef const char *(*STRSEARCH)(const char *, const char *);
    64 	STRSEARCH func;
    65 	char *str, *substr;
    66 
    67 	pCtx->LocalToString(params[1], &str);
    68 	pCtx->LocalToString(params[2], &substr);
    69 
    70 	func = (params[3]) ? _strstr : stristr;
    71 	const char *pos = func(str, substr);
    72 	if (pos)
    73 	{
    74 		return (pos - str);
    75 	}
    76 
    77 	return -1;
    78 }
    79 
    80 static cell_t sm_equal(IPluginContext *pCtx, const cell_t *params)
    81 {
    82 	typedef int (*STRCOMPARE)(const char *, const char *);
    83 	STRCOMPARE func;
    84 	char *str1, *str2;
    85 
    86 	pCtx->LocalToString(params[1], &str1);
    87 	pCtx->LocalToString(params[2], &str2);
    88 
    89 	func = (params[3]) ? strcmp : stricmp;
    90 
    91 	return (func(str1, str2)) ? 0 : 1;
    92 }
    93 
    94 static cell_t sm_strcopy(IPluginContext *pCtx, const cell_t *params)
    95 {
    96 	char *dest, *src, *start;
    97 	int len;
    98 
    99 	pCtx->LocalToString(params[1], &dest);
   100 	pCtx->LocalToString(params[3], &src);
   101 	len = params[2];
   102 
   103 	start = dest;
   104 	while ((*src) && (len--))
   105 	{
   106 		*dest++ = *src++;
   107 	}
   108 	*dest = '\0';
   109 
   110 	return (dest - start);
   111 }