char *skip_blanks(register char *p) { while (*p == ' ' || *p == '\t' || *p == '\n') { p++; CHECK_EOL(p); } return p; }
/* Assuming p points to a quote character, copy the quoted string to outfile. */ char *copy_quoted_string(register char *p) { do { if (*p == '\\') fputc(*p++, outfile); fputc(*p++, outfile); CHECK_EOL(p); } while (*p != '\"'); fputc(*p++, outfile); return p; }
/* Assuming p points to some character beyond an opening parenthesis, copy everything to outfile up to but not including the closing parenthesis. */ char *copy_up_to_paren(register char *p) { for (;;) { SKIP_BLANKS(p); /* We don't call skip_blanks() in order to */ CHECK_EOL(p); /* preserve blanks at the beginning of the line */ if (*p == ')') break; if (*p == '\"') p = copy_quoted_string(p); else fputc(*p++, outfile); } return p; }
void process_C_file(void) { register char *p; char *gettext, *defun; while (p = GET_LINE) { gettext = strstr(p, "GETTEXT"); defun = strstr(p, "DEFUN"); if (gettext || defun) { if (gettext) { p = gettext; p += 7; /* Skip over "GETTEXT" */ } else if (defun) { p = defun; p += 5; /* Skip over "DEFUN" */ } p = skip_blanks(p); if (*p++ != '(') continue; if (defun) { register int i; for (i = 0; i < 5; i++) /* Skip over commas to doc string */ while (*p++ != ',') CHECK_EOL(p); if (*p == '\n') p = GET_LINE; } p = skip_blanks(p); if (*p != '\"') /* Make sure there is a quoted string */ continue; if (defun && no_interactive_prompt(p)) continue; fprintf(outfile, "gettext("); if (gettext) p = copy_up_to_paren(p); else p = copy_quoted_string(p); fprintf(outfile, ")\n"); } } }
int parse_config_file(char *filename, int open_or_die) { int fd, i,j, n, err, in_sensor, s_start_line=0; float fl; int xyz[] = { 0, 0, 0 }; char *s; for(i=0;i<3;i++) for(j=0;j<CARRIER_SUBCHANS;j++) carrier_remap[i][j]=-1; if(!(sensor=malloc(sensors_max*sizeof(struct sensor_def)))) diag(SS_PARSER|DIE,"Out of memory (sensor array)\n"); if((fd=open(filename,O_RDONLY))==-1) { if(open_or_die) diag(SS_PARSER|DIERR,"Cannot open config file `%s'",filename); else { diag(SS_PARSER|INFO,"Default config file `%s' not found\n",filename); return 0; } } in_sensor=0; config.need_serial=config.need_pipe=0; if(!fetch(fd)) return 0; while(read_token(fd,1)==1) { if(*token=='#') { read_eol(fd); continue; } if(TOKEN("VideoDevice")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_STRING(config.video_device)) { if(!(config.video_device=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); } CHECK_EOL(fd); continue; } if(TOKEN("VideoNorm")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_INT(config.norm)) { if(TOKEN("PAL")) config.norm=VIDEO_MODE_PAL; else if(TOKEN("NTSC")) config.norm=VIDEO_MODE_NTSC; else if(TOKEN("SECAM")) config.norm=VIDEO_MODE_SECAM; else if(TOKEN("PAL-NC")) config.norm=3; else if(TOKEN("PAL-M")) config.norm=4; else if(TOKEN("PAL-N")) config.norm=5; else if(TOKEN("NTSC-JP")) config.norm=6; else if(TOKEN("AUTO")) config.norm=VIDEO_MODE_AUTO; else error("Invalid TV norm"); } CHECK_EOL(fd); continue; } if(TOKEN("AudioCaptureDevice")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_STRING(config.audio_in_device)) { if(!(config.audio_in_device=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); } CHECK_EOL(fd); continue; } if(TOKEN("AudioPlaybackDevice")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_STRING(config.audio_out_device)) { if(!(config.audio_out_device=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); } CHECK_EOL(fd); continue; } TEST_PARAM("Channel",config.channel,n>=0 && n<=65535); TEST_PARAM("FrameRate",config.frame_rate,n>=0 && n<=65535); TEST_PARAM("VideoAudioInput",config.video_audio_input,n>=0 && n<=65535); TEST_PARAM("VideoAudioVolume",config.video_audio_volume,n>=0 && n<=65535); if(TOKEN("Palette")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_INT(config.monochrome)) { if(TOKEN("Mono")) config.monochrome=1; else if(!TOKEN("Color")) { error("Invalid palette"); break; } } CHECK_EOL(fd); continue; } if(TOKEN("FrameSize")) { if(READ(fd)!=1) { synerr(); break; } if((s=strchr(token,'x'))==0) { synerr(); break; } *s=0; if(UNSET_INT(config.capx)) { if((config.capx=atoi(token))<=0 || (config.capy=atoi(s+1))<=0) error("Invalid FrameSize parameter"); } CHECK_EOL(fd); continue; } if(TOKEN("ImageFilters")) { while(READ(fd)==1) { if(TOKEN("UpsideDown")) config.image_filters^=IMAGE_FILTER_INVERT|IMAGE_FILTER_FLIP; else if(TOKEN("Invert")) config.image_filters^=IMAGE_FILTER_INVERT; else if(TOKEN("Flip")) config.image_filters^=IMAGE_FILTER_FLIP; else error("Invalid ImageFilters parameter"); } /*CHECK_EOL(fd);*/ continue; } TEST_PARAM("JpegQuality",config.jpeg_quality,n>=0 && n<=100); if(TOKEN("TunerFreq")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_FLOAT(config.tuner_freq)) { if(sscanf(token,"%f",&fl)==1) { if(fl<=0) error("Invalid TunerFreq parameter"); else config.tuner_freq=fl; } else synerr(); } CHECK_EOL(fd); continue; } if(TOKEN("Audio")) { while(READ(fd)==1) ; diag(SS_PARSER|INFO,"Ignoring deprecated `Audio' directive at line %d\n", line); continue; } if(TOKEN("AddressFamily")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_INT(config.address_family)) { // AF_* are >=0 if(TOKEN("any")) config.address_family=AF_UNSPEC; else if(TOKEN("inet")) config.address_family=AF_INET; else if(TOKEN("inet6")) config.address_family=AF_INET6; else error("Invalid AddressFamily parameter"); } CHECK_EOL(fd); continue; } TEST_PARAM("TCPPort",config.tcp_base_port,n>0 && n<=65535); TEST_PARAM("TCPAudioPort",config.tcp_audio_port,n>0 && n<=65535); if(TOKEN("SerialPort")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_STRING(config.serial_port)) { if(!(config.serial_port=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); } CHECK_EOL(fd); continue; } TEST_PARAM("MaxStreamingClients",config.max_clients,n>=0); TEST_PARAM("ControlTimeout",config.control_timeout,n>0); TEST_PARAM("ClientTimeout",config.client_timeout,n>0); TEST_PARAM("ClientAckTimeout",config.client_ack_timeout,n>0); if(TOKEN("Greeting")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_STRING(config.greeting)) { if(!(config.greeting=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); } CHECK_EOL(fd); continue; } if(TOKEN("NamedPipe")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_STRING(config.named_pipe)) { if(!(config.named_pipe=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); } CHECK_EOL(fd); continue; } if(TOKEN("LogFile")) { if(READ(fd)!=1) { synerr(); break; } if(UNSET_STRING(config.log_file)) { if(!(config.log_file=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); } CHECK_EOL(fd); continue; } if(TOKEN("Device")) { if(in_sensor) { synerr(); break; } in_sensor=1; continue; } if(TOKEN("{")) { if(in_sensor==1) { in_sensor=2; s_start_line=line; if(sensors==sensors_max) { sensors_max+=15; diag(SS_PARSER|DEBUG,"expanding device array to %d\n",sensors_max); sensor=realloc(sensor,sizeof(struct sensor_def)*sensors_max); if(!sensor) diag(SS_PARSER|DIE,"Out of memory (device array)\n"); } sensor[sensors].link=-1; sensor[sensors].widget='\0'; sensor[sensors].cfmin=sensor[sensors].cfmax=0; sensor[sensors].imin=0; sensor[sensors].imax=65535; sensor[sensors].name=sensor[sensors].hint=""; sensor[sensors].dir=SD_R; sensor[sensors].notifier=-1; CHECK_EOL(fd); continue; } else { synerr(); break; } } if(in_sensor==2) { if(TOKEN("Direction")) { if(READ(fd)!=1) { synerr(); break; } if(TOKEN("readwrite") || TOKEN("rw")) sensor[sensors].dir=SD_RW; else if(TOKEN("read") ||TOKEN("r")) sensor[sensors].dir=SD_R; /*else if(TOKEN("write")||TOKEN("w")) sensor[sensors].dir=SD_W;*/ else { error("Invalid direction"); break; } CHECK_EOL(fd); continue; } if(TOKEN("Notifier")) { if(READ(fd)!=1) { synerr(); break; } if(TOKEN("Device")) sensor[sensors].notifier=NT_DEVICE; else if(TOKEN("Client")) sensor[sensors].notifier=NT_CLIENT; else if(!TOKEN("None")) { error("Invalid notifier value"); break; } CHECK_EOL(fd); continue; } if(TOKEN("Name")) { if(READ(fd)!=1) { synerr(); break; } if(!(sensor[sensors].name=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); CHECK_EOL(fd); continue; } if(TOKEN("Hint")) { if(READ(fd)!=1) { synerr(); break; } if(!(sensor[sensors].hint=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); CHECK_EOL(fd); continue; } if(TOKEN("Visual")) { if(READ(fd)!=1) { synerr(); break; } if(TOKEN("slider")) sensor[sensors].widget='t'; else if(TOKEN("slider_x")) { if(xyz[0]) error("Multiple assignments to slider_x"); xyz[0]=1; sensor[sensors].widget='x'; } else if(TOKEN("slider_y")) { if(xyz[1]) error("Multiple assignments to slider_y"); xyz[1]=1; sensor[sensors].widget='y'; } else if(TOKEN("slider_z")) { if(xyz[2]) error("Multiple assignments to slider_z"); xyz[2]=1; sensor[sensors].widget='z'; } else if(TOKEN("gauge")) sensor[sensors].widget='p'; else { error("Invalid visual"); break; } CHECK_EOL(fd); continue; } if(TOKEN("Range")) { if(READ(fd)!=1) { synerr(); break; } if(sscanf(token,"%d",&sensor[sensors].imin)==0) { synerr(); break; } if(READ(fd)!=1) { synerr(); break; } if(sscanf(token,"%d",&sensor[sensors].imax)==0) { synerr(); break; } CHECK_EOL(fd); if(sensor[sensors].imax<=sensor[sensors].imin) { error("Invalid device range"); } continue; } if(TOKEN("Remap")) { if(READ(fd)!=1) { synerr(); break; } if(!(sensor[sensors].cfmin=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); if(READ(fd)!=1) { synerr(); break; } if(!(sensor[sensors].cfmax=strdup(token))) diag(SS_PARSER|DIE,"Out of memory\n"); CHECK_EOL(fd); continue; } #if 0 if(TOKEN("Init")) { if(READ(fd)!=1) { synerr(); break; } CHECK_EOL(fd); continue; } #endif if(TOKEN("Carrier")) { int link, id; if(READ(fd)!=1) { synerr(); break; } if(TOKEN("pipe")) { link=LINK_PIPE; config.need_pipe=1; } else if(TOKEN("serial")) { link=LINK_SERIAL; config.need_serial=1; } else if(TOKEN("internal")) link=LINK_INTERNAL; else { error("Invalid link type"); break; } if(READ(fd)!=1) { synerr(); break; } if(sscanf(token,"%d",&id)==0) { synerr(); break; } if(id<0||id>=CARRIER_SUBCHANS) error("Channel out of range"); carrier_remap[link][id]=sensors; sensor[sensors].link=link; sensor[sensors].channel=id; /*diag(SS_PARSER|DEBUG,"Mapping link %d subchan %d to device %d\n", link,id,sensors);*/ CHECK_EOL(fd); continue; } if(!TOKEN("}")) { error("Unrecognized token"); read_eol(fd); } } if(TOKEN("}")) { if(in_sensor==2) { in_sensor=0; err=0; if(sensor[sensors].notifier==-1) { if(sensor[sensors].link==LINK_INTERNAL) sensor[sensors].notifier=NT_CLIENT; else sensor[sensors].notifier=NT_DEVICE; } if(sensor[sensors].link==-1) { diag(SS_PARSER|ERROR,"Undefined link for device %d (starting at line %d)\n", sensors,s_start_line); err=1; } if(sensor[sensors].link==LINK_PIPE && sensor[sensors].dir!=SD_R) { diag(SS_PARSER|ERROR,"Illegal direction for device %d (starting at line %d): only `Read' allowed here\n", sensors,s_start_line); err=1; } #if 0 if(sensor[sensors].name==0) { diag(SS_PARSER|ERROR,"Missing name for device %d (starting at line %d)\n", sensors,s_start_line); err=1; } #endif if(sensor[sensors].widget=='\0') { if(!strcasecmp(sensor[sensors].name,"Pan")) { if(xyz[0]) error("Multiple assignments to slider_x"); sensor[sensors].widget='x'; xyz[0]=1; } else if(!strcasecmp(sensor[sensors].name,"Tilt")) { if(xyz[1]) error("Multiple assignments to slider_y"); sensor[sensors].widget='y'; xyz[1]=1; } else if(!strcasecmp(sensor[sensors].name,"Zoom")) { if(xyz[2]) error("Multiple assignments to slider_z"); sensor[sensors].widget='z'; xyz[2]=1; } } if(sensor[sensors].widget=='\0') { diag(SS_PARSER|ERROR, "Undefined visual for device %d (starting at line %d)\n", sensors,s_start_line); err=1; } if(sensor[sensors].cfmin==0) { /* .cfmax==0 too */ char buff[12]; snprintf(buff,12,"%d",sensor[sensors].imin); if(!(sensor[sensors].cfmin=strdup(buff))) diag(SS_PARSER|DIE,"Out of memory\n"); snprintf(buff,12,"%d",sensor[sensors].imax); if(!(sensor[sensors].cfmax=strdup(buff))) diag(SS_PARSER|DIE,"Out of memory\n"); } if(err) return 1; sensors++; continue; } else { synerr(); break; } } error("Unrecognized token"); read_eol(fd); } if(!syn && in_sensor) { diag(SS_PARSER|ERROR,"Incomplete definition for device %d (starting at line %d)\n", sensors,s_start_line); syn=1; } close(fd); line--; /* diag(SS_PARSER|DEBUG,"Parsed %d line%s\n",line,line==1?"":"s"); */ return syn; }