Example #1
0
char *skip_blanks(register char *p)
{
	while (*p == ' ' || *p == '\t' || *p == '\n') {
		p++;
		CHECK_EOL(p);
	}
	return p;
}
Example #2
0
/* 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;
}
Example #3
0
/* 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;
}
Example #4
0
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");
		}
	}
}
Example #5
0
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;
}