Ejemplo n.º 1
0
void
GetPrivateProfileString (const char *section, const char *var,
			 const char *def, char *get, int length,
			 const char *filename)
{
  char *buf;
  char *section_found;
  char *key_found;

  memset (get, 0, length);

  if (!filename)
    {
      strncpy (get, def, length);
      return;
    }

  buf = file2buf (filename);
  if (buf)
    {
      section_found = SearchSection (buf, section);
      if (section_found)
	{
	  key_found = SearchKey (section_found, var);
	  if (key_found)
	    {
	      char *val_start;
	      char *val_end;
	      val_start = strchr (key_found, '=') + 1;
	      val_end = val_start;
	      while ((*val_end != '\0') && (*val_end != '\n')
		     && (*val_end != '\r'))
		val_end++;
	      strncpy (get, val_start, val_end - val_start);
	      get[val_end - val_start] = '\0';
	      return;
	    }
	}
    }
  strncpy (get, def, length);
}
Ejemplo n.º 2
0
void
WritePrivateProfileString (const char *section, const char *var,
			   const char *var_name, const char *filename)
{
  FILE *file;
  struct stat sb;
  int res;

  res = stat (filename, &sb);
  if (-1 == res)		// fichier n'existe pas
    {
      file = fopen (filename, "w");
      InsertSectionKey (section, var, var_name, file, 0);
      fclose (file);
    }
  else
    {
      int filesize;
      filesize = sb.st_size - 1;	// on ne lit pas EOT
      if (filesize >= 0)
	{
	  char *buf;
	  char *section_begin;
	  int size1, size2;

	  buf = file2buf (filename);

	  section_begin = SearchSection (buf, section);
	  if (NULL != section_begin)	//section existe déjà
	    {
	      char *key_begin;
	      key_begin = SearchKey (section_begin, var);
	      if (NULL != key_begin)	// la clé existe : on copie la partie d'avant l'ancienne clé, la nouvelle clé, puis la partie d'après l'ancienne clé
		{
		  int old_key_size;
		  char *key_end;

		  size1 = key_begin - buf;
		  key_end = strstr (key_begin, "\n");
		  if (NULL != key_end)
		    {
		      old_key_size = key_end - key_begin + 1;
		      size2 = filesize - (size1 + old_key_size);
		      file = fopen (filename, "w");
		      fwrite (buf, size1, 1, file);
		      WriteKey (var, var_name, file);
		      fwrite (buf + size1 + old_key_size, size2, 1, file);
		      fclose (file);
		    }
		  else
		    {		// la clé est la dernière du fichier
		      file = fopen (filename, "w");
		      fwrite (buf, size1, 1, file);
		      WriteKey (var, var_name, file);
		      fclose (file);
		    }

		}
	      else
		{		// clé n'existe pas : on la rajoute avant la prochaine section
		  char *next_section_begin;
		  next_section_begin = strstr (section_begin, "*");
		  if (NULL == next_section_begin)	// la section recherchée est unique : il suffit de copier la clé à la fin du fichier
		    {
		      file = fopen (filename, "a");
		      WriteKey (var, var_name, file);
		      fclose (file);
		    }
		  else
		    {		// on insère la clé avant la prochaine section
		      size1 = next_section_begin - buf;
		      size2 = filesize - size1;
		      file = fopen (filename, "w");
		      fwrite (buf, size1, 1, file);
		      WriteKey (var, var_name, file);
		      fwrite (buf + size1, size2, 1, file);
		      fclose (file);
		    }
		}
	    }
	  else
	    {			//section n'existe pas : on la rajoute ainsi que la clé
	      file = fopen (filename, "a");
	      InsertSectionKey (section, var, var_name, file, 1);
	      fclose (file);
	    }
	  free (buf);
	}
      else
	{			//taille fichier < 0
	  file = fopen (filename, "w");
	  InsertSectionKey (section, var, var_name, file, 0);
	  fclose (file);
	}
    }
}
Ejemplo n.º 3
0
int main(int argc, char *argv[]) {
	if(argc != 2) {
		printf("Usage: xsvfplayer <filename>\n");
		return 1;
	}
	
	if(NULL == (file = fopen(argv[1], "r"))) {
		printf("Cannot open file.\n");
		return 1;
	}
	fseek(file, 0, SEEK_END);
	filesize = ftell(file);
	rewind(file);
	
	if(NULL == (xsvfprog = xsvfprog_open())) {
		printf("Cannot connect to XSVF player.\n");
		return 1;
	}
	if(SUCCESS != xsvfprog_init(xsvfprog)) {
		printf("Initialization of XSVF player failed.\n");
		xsvfprog_prgend(xsvfprog);
		return 1;
	}

#ifdef DEBUG
	debugfile = fopen("debug.xsvf", "w");
#endif
	printf("Programming...");
	while(!feof(file) && !quit) {
		bufsize = 0;
		/* get command */
		file2buf(1);
#ifdef DEBUG
		printf("instr 0x%02x: ", buf[0]);
#endif
		/* read additional command parameters */
		switch(buf[0]) {
		
		case XCOMPLETE:
			/* quit if XCOMPLETE command reached */
			quit = 1;
			break;
		
		case XREPEAT:
		case XSTATE:
		case XENDIR:
		case XENDDR:
			/* these commands need one additional byte */
			file2buf(1);
#ifdef DEBUG
			printf("par = %d, ", buf[1]);
#endif
			break;
		
		case XRUNTEST:
			/* this command needs four additional bytes */
			file2buf(4);
#ifdef DEBUG
			printf("delay = %d us, ", ntohl(*((long*) &buf[1])));
#endif
			break;
		
		case XTDOMASK:
		case XSDR:
		case XSDRB:
		case XSDRC:
		case XSDRE:
			/* these commands need drSize additional bits */
			file2buf(BITS_TO_BYTES(drSize));
			break;
		
		case XSDRTDO:
		case XSDRTDOB:
		case XSDRTDOC:
		case XSDRTDOE:
			/* these commands need 2x drSize additional bits */
			file2buf(2 * BITS_TO_BYTES(drSize));
			break;
		
		case XSDRSIZE:
			file2buf(4);
			drSize = ntohl(*((long*) &buf[1]));
#ifdef DEBUG
			printf("drSize = %d, ", drSize);
#endif
			if (BITS_TO_BYTES(drSize) > MAX_BITVEC_BYTES) {
				exit_err("\nData Register too long.\n");
			}
			break;
		
		case XSIR:
			file2buf(1);
			irSize = *((unsigned char*) &buf[1]);
#ifdef DEBUG
			printf("irSize = %d, ", irSize);
#endif
			if (BITS_TO_BYTES(irSize) > MAX_BITVEC_BYTES) {
				exit_err("\nInstruction Register too long.\n");
			}
			file2buf(BITS_TO_BYTES(irSize));
			break;
		
		case XSIR2:
			file2buf(2);
			irSize = ntohs(*((short*) &buf[1]));
#ifdef DEBUG
			printf("irSize = %d, ", irSize);
#endif
			if (BITS_TO_BYTES(irSize) > MAX_BITVEC_BYTES) {
				exit_err("\nInstruction Register too long.\n");
			}
			file2buf(BITS_TO_BYTES(irSize));
			break;
		
		case XSETSDRMASKS:
			file2buf(2 * BITS_TO_BYTES(drSize));
			drSize2 = BitStringOnes(drSize, &buf[1 + BITS_TO_BYTES(drSize)]);
#ifdef DEBUG
			printf("drSize2 = %d, ", drSize2);
#endif
			if (BITS_TO_BYTES(drSize2) > MAX_BITVEC_BYTES) {
				exit_err("\nData Register2 too long.\n");
			}
			break;
		
		case XSDRINC:
			file2buf(BITS_TO_BYTES(drSize) + 1);
			int num = *((unsigned char*) &buf[1 + BITS_TO_BYTES(drSize)]);
			file2buf(num * BITS_TO_BYTES(drSize2));
			break;
		
		case XCOMMENT:
			do {
				ch = fgetc(file);
			} while(ch != 0 && ch != EOF);
			/* we don't send comments to the programmer... */
			continue;
			break;
		
		default:
			exit_err("\nIllegal XSVF command.\n");
			break;
		
		}
		
#ifdef DEBUG
		printf("%d bytes long\n", bufsize);
		fwrite(buf, 1, bufsize, debugfile);
#endif
		
		ret = xsvfprog_exec(xsvfprog, buf, bufsize);
#ifdef DEBUG
		printf("%d\n", ret);
#endif

		switch(ret) {
		
		case 0:
			/* success, do nothing, just go on */
			break;
		
		case UNKNOWN_COMMAND:
			exit_err("\nProgramming error: Unknown command.\n");
			break;
		
		case XE_TDOMISMATCH:
			exit_err("\nProgramming error: Captured TDO value differs from expected TDO value.\n");
			break;
		
		case XE_ILLEGALCMD:
			exit_err("\nProgramming error: Illegal XSVF command.\n");
			break;
		
		case XE_ILLEGALSTATE:
			exit_err("\nProgramming error: Illegal TAP state.\n");
			break;
		
		case XE_DATAOVERFLOW:
			exit_err("\nProgramming error: Bit string overflow.\n");
			break;
		
		case XE_DATAUNDERFLOW:
			exit_err("\nProgramming error: End of command buffer reached expecting more data.\n");
			break;
		
		default:
			exit_err("\nUnknown programming error.\n");
			break;
		
		}

		filepos += bufsize;
		printf("\rProgramming... %3u%%", 100*filepos/filesize);
		fflush(stdout);
	}
	xsvfprog_prgend(xsvfprog);
	printf("\nDone.\n");
	
	fclose(file);
#ifdef DEBUG
	fclose(debugfile);
#endif
	xsvfprog_close(xsvfprog);
}