gambas-source-code/main/gbx/gbx_c_quote.c
Benoît Minisini 4c02c6d338 ******** Merged /branches/64bits r918:1003 into /trunk
[CONFIGURATION]
* NEW: 64 bits port.

[EXAMPLES]
* BUG: Fixed the AnalogWatch example.

[WIKI CGI SCRIPT]
* NEW: Some little cosmetic changes.

[INTERPRETER]
* NEW: The extern function implementation has been redesigned and is now
  based on libffi, so that it works on 64 bits system. Because of a flaw in
  the compiler design, projects that use the Pointer datatype must be
  recompiled to be used on a 64 bits system. This flaw will be fixed in
  Gambas 3.
* OPT: Put some tables into read-only memory. About 1000 bytes are saved
  for each running interpreter, except the first one.
* BUG: Does not crash anymore if a component cannot be loaded.
* NEW: Spanish translation updated.
* NEW: A new interpreter API for returning a pointer.

[COMPILER]
* BUG: Correctly compiles LONG constants inside code.

[GB.DEBUG]
* BUG: Compiles and links the gb.debug components with the thread
  libraries.

[GB.DB.SQLITE3]
* BUG: Getting the primary index of a table without primary index is safe
  now.

[GB.GTK]
* BUG: Modified the GLib priority of watched descriptors, as the main loop 
  could enter in a loop in which user interface events were not managed.
* BUG: Message boxes use application title without crashing now.

[GB.OPENGL]
* BUG: Disable dead code.

[GB.QT.EXT]
* BUG: TextEdit.TextWidth and TextEdit.TextHeight were not declared as
  read-only properties.

[GB.XML.XSLT]
* BUG: XSLT class is now declared as being not creatable.


git-svn-id: svn://localhost/gambas/trunk@1006 867c0c6c-44f3-4631-809d-bfa615b0a4ec
2008-01-17 21:39:26 +00:00

207 lines
4.1 KiB
C

/***************************************************************************
gbx_c_quote.c
(c) 2000-2007 Benoit Minisini <gambas@users.sourceforge.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
***************************************************************************/
#define __GBX_C_QUOTE_C
#include "gbx_info.h"
#ifndef GBX_INFO
#include "gb_common.h"
#include "gb_error.h"
#include "gambas.h"
#include "gbx_api.h"
#include "gbx_string.h"
#include "gbx_local.h"
#include "gbx_c_quote.h"
BEGIN_METHOD(CQUOTE_call, GB_STRING str)
char *result = NULL;
int i;
unsigned char c;
char buf[6];
STRING_add(&result, "\"", 1);
for (i = 0; i < LENGTH(str); i++)
{
c = STRING(str)[i];
if (c == '\n')
STRING_add(&result, "\\n", 2);
else if (c == '\r')
STRING_add(&result, "\\r", 2);
else if (c == '\t')
STRING_add(&result, "\\t", 2);
else if (c == '"')
STRING_add(&result, "\\\"", 2);
else if (c == '\\')
STRING_add(&result, "\\\\", 2);
else if (c < ' ' || c > 126)
{
snprintf(buf, sizeof(buf), "\\x%02X", c);
STRING_add(&result, buf, 4);
}
else
STRING_add(&result, (char *)&c, 1);
}
STRING_add(&result, "\"", 1);
STRING_extend_end(&result);
GB_ReturnString(result);
END_METHOD
BEGIN_METHOD(CQUOTE_shell, GB_STRING str)
char *str = STRING(str);
int len = LENGTH(str);
char *result = NULL;
int i;
unsigned char c;
char buf[8];
if (!LOCAL_is_UTF8)
{
STRING_conv(&result, str, len, "UTF-8", LOCAL_encoding, FALSE);
str = result;
result = NULL;
len = str ? strlen(str) : 0;
}
for (i = 0; i < len; i++)
{
c = str[i];
if (c == '\n')
STRING_add(&result, "$'\\n'", 5);
else if (c == '\r')
STRING_add(&result, "$'\\r'", 5);
else if (c == '\t')
STRING_add(&result, "$'\\t'", 5);
else if (c < ' ') //|| (c > 126 && !LOCAL_is_UTF8))
{
snprintf(buf, sizeof(buf), "$'\\x%02X'", c);
STRING_add(&result, buf, 7);
}
else if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || index(".-/_~", c) || c > 126)
STRING_add(&result, (char *)&c, 1);
else
{
buf[0] = '\\';
buf[1] = c;
STRING_add(&result, buf, 2);
}
}
STRING_extend_end(&result);
GB_ReturnString(result);
END_METHOD
static int read_hex_digit(unsigned char c)
{
if (c >= '0' && c <= '9')
return (c - '0');
else if (c >= 'A' && c <= 'F')
return (c - 'A' + 10);
else if (c >= 'a' && c <= 'f')
return (c - 'a' + 10);
else
return 0;
}
BEGIN_METHOD(CUNQUOTE_call, GB_STRING str)
char *str = STRING(str);
int len = LENGTH(str);
char *result = NULL;
int i;
unsigned char c;
if (len >= 2 && str[0] == '"' && str[len - 1] == '"')
{
str++;
len -= 2;
}
for (i = 0; i < len; i++)
{
c = str[i];
if (c == '\\')
{
i++;
if (i >= len)
break;
c = str[i];
if (c == 'n')
c = '\n';
else if (c == 't')
c = '\t';
else if (c == 'r')
c = '\r';
else if (c == 'x')
{
if (i >= (len - 2))
break;
c = (read_hex_digit(str[i + 1]) << 4) + read_hex_digit(str[i + 2]);
i += 2;
}
}
STRING_add(&result, (char *)&c, 1);
}
STRING_extend_end(&result);
GB_ReturnString(result);
END_METHOD
#endif
GB_DESC NATIVE_Quote[] =
{
GB_DECLARE("Quote", 0), GB_VIRTUAL_CLASS(),
GB_STATIC_METHOD("_call", "s", CQUOTE_call, "(String)s"),
GB_STATIC_METHOD("Shell", "s", CQUOTE_shell, "(String)s"),
GB_END_DECLARE
};
GB_DESC NATIVE_Unquote[] =
{
GB_DECLARE("UnQuote", 0), GB_VIRTUAL_CLASS(),
GB_STATIC_METHOD("_call", "s", CUNQUOTE_call, "(String)s"),
GB_END_DECLARE
};