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); }
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); } } }
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); }