Synchronet now requires the libarchive development package (e.g. libarchive-dev on Debian-based Linux distros, libarchive.org for more info) to build successfully.

js_sprintf.c 3.01 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/* js_sprintf.c */

/* Synchronet JavaScript "[s]printf" implementation */

/* $Id$ */

/****************************************************************************
 * @format.tab-size 4		(Plain Text/Source Code File Header)			*
 * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
 *																			*
11
 * Copyright 2013 Rob Swindell - http://www.synchro.net/copyright.html		*
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
 *																			*
 * 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 2			*
 * of the License, or (at your option) any later version.					*
 * See the GNU General Public License for more details: gpl.txt or			*
 * http://www.fsf.org/copyleft/gpl.html										*
 *																			*
 * Anonymous FTP access to the most recent released source is available at	*
 * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
 *																			*
 * Anonymous CVS access to the development source and modification history	*
 * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
 *     (just hit return, no password is necessary)							*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
 *																			*
 * For Synchronet coding style and modification guidelines, see				*
 * http://www.synchro.net/source.html										*
 *																			*
 * You are encouraged to submit any modifications (preferably in Unix diff	*
 * format) via e-mail to mods@synchro.net									*
 *																			*
 * Note: If this box doesn't appear square, then you need to fix your tabs.	*
 ****************************************************************************/

#include "sbbs.h"
#include "xpprintf.h"	/* Hurrah for Deuce! */

char* DLLCALL
js_sprintf(JSContext *cx, uint argn, uintN argc, jsval *argv)
{
44
	char*		op;
deuce's avatar
deuce committed
45 46
	char*		p;
	char		*p2=NULL;
47
	size_t		p2_sz=0;
48

49 50
	JSVALUE_TO_MSTRING(cx, argv[argn], op, NULL);
	argn++;
deuce's avatar
deuce committed
51 52
	if(JS_IsExceptionPending(cx))
		JS_ClearPendingException(cx);
deuce's avatar
deuce committed
53
	if(op==NULL)
54 55
		return(NULL);

56
	p=op;
57 58 59
	p=xp_asprintf_start(p);
    for(; argn<argc; argn++) {
		if(JSVAL_IS_DOUBLE(argv[argn]))
60
			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_DOUBLE,JSVAL_TO_DOUBLE(argv[argn]));
61 62 63 64 65
		else if(JSVAL_IS_INT(argv[argn]))
			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_INT(argv[argn]));
		else if(JSVAL_IS_BOOLEAN(argv[argn]) && xp_printf_get_type(p)!=XP_PRINTF_TYPE_CHARP)
			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_BOOLEAN(argv[argn]));
		else {
deuce's avatar
deuce committed
66 67 68 69 70
			JSVALUE_TO_RASTRING(cx, argv[argn], p2, &p2_sz, NULL);
			if(JS_IsExceptionPending(cx))
				JS_ClearPendingException(cx);
			if(p2==NULL) {
				free(p);
deuce's avatar
deuce committed
71
				return NULL;
deuce's avatar
deuce committed
72
			}
deuce's avatar
deuce committed
73
			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_CHARP,p2);
74 75 76
		}
	}

deuce's avatar
deuce committed
77 78 79
	if(p2)
		free(p2);
	p2=xp_asprintf_end(p, NULL);
80
	free(op);
deuce's avatar
deuce committed
81
	return p2;
82
}
83 84 85 86 87 88

void DLLCALL
js_sprintf_free(char* p)
{
	xp_asprintf_free(p);
}