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; }
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; }
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; }
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; }
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; }
/** * 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; }