Esempio n. 1
0
const char* file_config_list(const char* const_list, const char* (*expand_dir)(const char* tag), const char* ref_dir)
{
	char* list = strdup(const_list);
	int i;

	FL.list_buffer[0] = 0;

	i = 0;
	while (list[i]) {
		char c;
		const char* file;

		file = stoken(&c, &i, list, ";", "");

		if (FL.list_buffer[0])
			sncat(FL.list_buffer, sizeof(FL.list_buffer), ";");

		if (ref_dir)
			sncat(FL.list_buffer, sizeof(FL.list_buffer), file_abs(ref_dir, file));
		else
			sncat(FL.list_buffer, sizeof(FL.list_buffer), file);
	}

	free(list);

	return FL.list_buffer;
}
Esempio n. 2
0
static int ui_color_load(struct advance_ui_context* context, adv_conf* cfg_context, int f, int b, const char* tag)
{
	const char* fs;
	const char* bs;
	const char* s;
	int p;
	char c;
	char* d;

	s = conf_string_get_default(cfg_context, tag);

	d = strdup(s);

	p = 0;

	fs = stoken(&c, &p, d, " ", "");
	if (c != ' ') {
		target_err("Error in option %s\n", tag);
		return -1;
	}
	sskip(&p, d, " ");
	bs = stoken(&c, &p, d, " ", "");
	if (c != 0) {
		target_err("Error in option %s\n", tag);
		return -1;
	}

	if (f >= 0) {
		if (ui_color_hex(&context->config.ui_color[f], fs) != 0) {
			target_err("Error in option %s\n", tag);
			return -1;
		}
	}

	if (b >= 0) {
		if (ui_color_hex(&context->config.ui_color[b], bs) != 0) {
			target_err("Error in option %s\n", tag);
			return -1;
		}
	}

	free(d);

	return 0;
}
Esempio n. 3
0
adv_error monitor_conversion_legacy(adv_conf* context)
{
	char buffer[1024];
	adv_error p_error;
	adv_error h_error;
	adv_error v_error;
	const char* p;
	const char* h;
	const char* v;
	char* ps;
	char* hs;
	char* vs;
	char c;
	int pi,hi,vi;

	/* LEGACY support of old device_video_p/h/vclock format */
	p_error = conf_string_section_get(context, "", "device_video_pclock", &p);
	h_error = conf_string_section_get(context, "", "device_video_hclock", &h);
	v_error = conf_string_section_get(context, "", "device_video_vclock", &v);

	/* check if all are missing */
	if (p_error != 0 && h_error != 0 && v_error != 0)
		return 0;

	/* partially missing */
	if (p_error != 0 || h_error != 0 || v_error != 0) {
		error_set("Missing options 'device_video_p/h/vclock'");
		return -1;
	}

	buffer[0] = 0;

	ps = strdup(p);
	hs = strdup(h);
	vs = strdup(v);

	/* set the new format */
	pi = 0;
	sskip(&pi, ps, " ");
	while (ps[pi]) {
		const char* pt;

		pt = stoken(&c, &pi, ps, ",", " ");

		hi = 0;
		sskip(&hi, hs, " ");
		while (hs[hi]) {
			const char* ht;

			ht = stoken(&c, &hi, hs, ",", " ");

			vi = 0;
			sskip(&vi, vs, " ");
			while (vs[vi]) {
				const char* vt;

				vt = stoken(&c, &vi, vs, ",", " ");

				if (*buffer != 0)
					sncat(buffer, sizeof(buffer), " ; ");

				sncatf(buffer, sizeof(buffer), "%s / %s / %s", pt, ht, vt);

				sskip(&vi, vs, " ");
			}

			sskip(&hi, hs, " ");
		}

		sskip(&pi, ps, " ");
	}

	free(ps);
	free(hs);
	free(vs);

	conf_string_set(context, "", "device_video_clock", buffer);

	/* remove the old copy */
	conf_remove(context, "", "device_video_pclock");
	conf_remove(context, "", "device_video_hclock");
	conf_remove(context, "", "device_video_vclock");

	return 0;
}
Esempio n. 4
0
char *cpp_operator(int *poper,type **pt)
{
    int i;
    type *typ_spec;
    char *s;

    *pt = NULL;
    stoken();                           /* skip over operator keyword   */
    for (i = 0; i < arraysize(oparray); i++)
    {   if (oparray[i].tokn == tok.TKval)
            goto L1;
    }

    /* Look for type conversion */
    if (type_specifier(&typ_spec))
    {   type *t;

        t = ptr_operator(typ_spec);     // parse ptr-operator
        fixdeclar(t);
        type_free(typ_spec);
        *pt = t;
        return cpp_typetostring(t,"?B");
    }

    cpperr(EM_not_overloadable);        // that token cannot be overloaded
    s = "_";
    goto L2;

L1:
    s = oparray[i].string;
    *poper = oparray[i].oper;
    switch (*poper)
    {   case OPcall:
            if (stoken() != TKrpar)
                synerr(EM_rpar);                /* ')' expected                 */
            break;

        case OPbrack:
            if (stoken() != TKrbra)
                synerr(EM_rbra);                /* ']' expected                 */
            break;

        case OPnew:
            if (stoken() != TKlbra)
                goto Lret;
            *poper = OPanew;            // operator new[]
            s = cpp_name_anew;
            goto L3;

        case OPdelete:
            if (stoken() != TKlbra)
                goto Lret;
            *poper = OPadelete;         // operator delete[]
            s = cpp_name_adelete;
        L3:
            if (stoken() != TKrbra)
                synerr(EM_rbra);                // ']' expected
            if (!(config.flags4 & CFG4anew))
            {   cpperr(EM_enable_anew);         // throw -Aa to support this
                config.flags4 |= CFG4anew;
            }
            break;
    }
L2:
    stoken();
Lret:
    return s;
}
Esempio n. 5
0
File: xml.cpp Progetto: faesong/oom
Xml::Token Xml::parse()
{
	char buffer[1024 * 1024]; // increase buffer -rj
	char* p;

again:
	bool endFlag = false;
	nextc();
	if (c == EOF)
	{
		printf("unexpected EOF reading *.oom file at level %d, line %d, <%s><%s><%s>\n",
				level, _line, _tag.toLatin1().constData(), _s1.toLatin1().constData(), _s2.toLatin1().constData());
		return level == 0 ? End : Error;
	}

	_s1 = QString("");
	if (inTag)
	{
		//-------------------
		// parse Attributes
		//-------------------
		if (c == '/')
		{
			nextc();
			token('>');
			if (c != '>')
			{
				printf("Xml: unexpected char '%c', expected '>'\n", c);
				goto error;
			}
			_s1 = _tag;
			inTag = false;
			--level;
			return TagEnd;
		}
		_s2 = QString("");
		token('=');
		_s1 = _s2;
		nextc(); // skip space
		if (c == '"')
			stoken();
		else
			token('>');
		if (c == '>')
			inTag = false;
		else
			--bufptr;
		_s2 = strip(_s2);
		return Attribut;
	}
	if (c == '<')
	{
		//--------------
		// parse Tag
		//--------------
		next();
		if (c == '/')
		{
			endFlag = true;
			next();
		}
		if (c == '?')
		{
			next();
			p = buffer;
			for (;;)
			{
				if (c == '?' || c == EOF || c == '>')
					break;
				*p++ = c;
				// TODO: check overflow
				next();
			}
			*p = 0;
			_s1 = QString(buffer);
			if (c == EOF)
			{
				fprintf(stderr, "XML: unexpected EOF\n");
				goto error;
			}
			nextc();
			if (c != '>')
			{
				fprintf(stderr, "XML: '>' expected\n");
				goto error;
			}
			next();
			return Proc;
		}
		else if (c == '!')
		{ // process comment
			bool endc = false;
			for (;;)
			{
				next();
				if (c == '>' && endc)
					break;
				endc = c == '-';
				if (c == EOF)
				{
					fprintf(stderr, "XML: unexpected EOF in comment\n");
					goto error;
				}
			}
			goto again;
		}
		p = buffer;
		for (;;)
		{
			if (c == '/' || c == ' ' || c == '\t' || c == '>' || c == '\n' || c == EOF)
				break;
			// TODO: check overflow
			*p++ = c;
			next();
		}
		*p = 0;
		_s1 = QString(buffer);
		// skip white space:
		while (c == ' ' || c == '\t' || c == '\n')
			next();
		if (c == '/')
		{
			nextc();
			if (c == '>')
				return Flag;
			fprintf(stderr, "XML: '>' expected\n");
			goto error;
		}
		if (c == '?')
		{
			nextc();
			if (c == '>')
				return Proc;
			fprintf(stderr, "XML: '>' expected\n");
			goto error;
		}
		if (c == '>')
		{
			if (endFlag)
			{
				--level;
				return TagEnd;
			}
			else
			{
				++level;
				return TagStart;
			}
		}
		else
		{
			_tag = _s1;
			--bufptr;
			inTag = true;
			++level;
			if (!endFlag)
			{
				return TagStart;
			}
			fprintf(stderr, "XML: endFlag expected\n");
			goto error;
		}
	}
	else
	{
		//--------------
		// parse Text
		//--------------
		if (level == 0)
		{
			fprintf(stderr, "XML: level = 0\n");
			goto error;
		}
		p = buffer;
		for (;;)
		{
			if (c == EOF || c == '<')
				break;
			if (c == '&')
			{
				next();
				if (c == '<')
				{ // be tolerant with old oom files
					*p++ = '&';
					continue;
				}
				char name[32];
				char* dp = name;
				*dp++ = c;
				for (; dp - name < 31;)
				{
					next();
					if (c == ';')
						break;
					*dp++ = c;
				}
				*dp = 0;
				if (strcmp(name, "lt") == 0)
					c = '<';
				else if (strcmp(name, "gt") == 0)
					c = '>';
				else if (strcmp(name, "apos") == 0)
					c = '\\';
				else if (strcmp(name, "quot") == 0)
					c = '"';
				else if (strcmp(name, "amp") == 0)
					c = '&';
				else
					c = '?';
			}
			*p++ = c;
			next();
		}
		*p = 0;
		_s1 = QString(buffer);

		if (c == '<')
			--bufptr;
		return Text;
	}
error:
	fprintf(stderr, "XML Parse Error at line %d col %d\n", _line, _col + 1);
	return Error;
}
Esempio n. 6
0
/**
 * Initialize the LCD support.
 * \note To prevent the program termination if the server is closed you
 * need to ignore or intercept the SIGPIPE signal.
 * \param address Server location in the form [address][:port]. The address may
 * be a name or a dot address. The default address is 127.0.0.1. The default
 * port is 13666.
 * \param timeou Connection timeout in milleseconds.
 * \return The LCD context to use on other calls or 0 on error.
 */
adv_lcd* adv_lcd_init(const char* address, unsigned timeout)
{
	struct sockaddr_in server_addr;
	struct hostent* host;
	adv_lcd* context;
	int r;
	struct timeval tv;
	char buffer[128];
	const char* s_wid;
	const char* s_hgt;
	char server_buffer[256];
	int p;
	char c;
	const char* s_addr;
	const char* s_port;
	unsigned port;
	unsigned i;

	tv.tv_sec = timeout / 1000;
	tv.tv_usec = (timeout % 1000) * 1000;

	sncpy(server_buffer, sizeof(server_buffer), address);

	p = 0;
	s_addr = stoken(&c, &p, server_buffer, ":", " ");
	if (c != 0 && c != ':') {
		log_std(("ERROR:lcd: invalid server specification '%s'\n", address));
		return 0;
	}
	s_port = stoken(&c, &p, server_buffer, "", " ");

	if (*s_addr == 0) {
		s_addr = "127.0.0.1";
	}
	if (*s_port == 0) {
		s_port = "13666";
	}

	port = atoi(s_port);

	host = gethostbyname(s_addr);
	if (!host) {
		log_std(("ERROR:lcd: gethostbyname(%s) failed, with error %d\n", address, h_errno));
		goto err;
	}

	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(port);
	server_addr.sin_addr = *(struct in_addr *)host->h_addr;

	context = malloc(sizeof(adv_lcd));
	if (!context)
		goto err;

	context->mute_flag = 0;

	context->f = socket(PF_INET, SOCK_STREAM, 0);
	if (context->f < 0) {
		log_std(("ERROR:lcd: socket(PF_INET, SOCK_STREAM, 0) failed, with error %d, %s\n", errno, strerror(errno)));
		goto err_context;
	}

	r = connect(context->f, (struct sockaddr*)&server_addr, sizeof(server_addr));
	if (r < 0) {
		log_std(("ERROR:lcd: connect(%s:%d) failed, with error %d, %s\n", address, port, errno, strerror(errno)));
		goto err_close;
	}

	r = fcntl(context->f, F_SETFL, O_NONBLOCK);
	if (r < 0) {
		log_std(("ERROR:lcd: fcntl(%s:%d) failed, with error %d, %s\n", address, port, errno, strerror(errno)));
		goto err_shutdown;
	}

	r = adv_lcd_sendstr_wait(context, "hello\n", &tv);
	if (r != 0) {
		goto err_shutdown;
	}

	r = adv_lcd_recvstr_wait(context, buffer, sizeof(buffer), &tv);
	if (r != 0) {
		goto err_shutdown;
	}

	log_std(("lcd: server answer '%s'\n", buffer));

	/* example of server answer: */
	/* connect LCDproc 0.4.3 protocol 0.3 lcd wid 20 hgt 4 cellwid 5 cellhgt 8 */

	if (strncmp(buffer, "connect", 7) != 0) {
		log_std(("ERROR:lcd: invalid server answer '%s'\n", buffer));
		goto err_shutdown;
	}

	s_wid = strstr(buffer, " wid ");
	s_hgt = strstr(buffer, " hgt ");
	if (s_wid == 0 || s_hgt == 0) {
		log_std(("ERROR:lcd: invalid server answer '%s'\n", buffer));
		goto err_shutdown;
	}

	context->width = atoi(s_wid + 4);
	context->height = atoi(s_hgt + 4);
	if (context->width < 1 || context->height < 1) {
		log_std(("ERROR:lcd: invalid size in server answer '%s'\n", buffer));
		goto err_shutdown;
	}

	r = adv_lcd_sendstr_wait(context, "screen_add advance\n", &tv);
	if (r != 0) {
		goto err_shutdown;
	}

	for(i=0;i<context->height;++i) {
		char buffer[256];
		snprintf(buffer, sizeof(buffer), "widget_add advance message%d scroller\n", i);
		r = adv_lcd_sendstr_wait(context, buffer, &tv);
		if (r != 0) {
			goto err_shutdown;
		}
	}

	return context;

err_shutdown:
	shutdown(context->f, 2);
err_close:
	close(context->f);
err_context:
	free(context);
err:
	return 0;
}