static gchar * create_serial_barcode (const gchar *serial) { gchar *savefile; const gchar *cache_dir; struct zint_symbol *barcode; cache_dir = g_get_user_cache_dir (); /* Create the directory if it's missing */ g_mkdir_with_parents (cache_dir, 0755); savefile = g_build_filename (cache_dir, "product_serial.png", NULL); barcode = ZBarcode_Create(); strncpy ((char *) barcode->outfile, savefile, 4096); if (ZBarcode_Encode_and_Print (barcode, (guchar *) serial, 0, 0)) { g_warning ("Error while generating barcode: %s", barcode->errtxt); } ZBarcode_Delete (barcode); return savefile; }
int batch_process(struct zint_symbol *symbol, char *filename) { FILE *file; unsigned char buffer[7100]; unsigned char character; int posn = 0, error_number = 0, line_count = 1; char output_file[127]; char number[12], reverse_number[12]; int inpos, local_line_count; char format_string[127], reversed_string[127], format_char; int format_len, i; char adjusted[2]; memset(buffer, 0, sizeof(unsigned char) * 7100); if(symbol->outfile[0] == '\0') { strcpy(format_string, "~~~~~.png"); } else { if(strlen(format_string) < 127) { strcpy(format_string, symbol->outfile); } else { strcpy(symbol->errtxt, "Format string too long"); return ZERROR_INVALID_DATA; } } memset(adjusted, 0, sizeof(char) * 2); if(!strcmp(filename, "-")) { file = stdin; } else { file = fopen(filename, "rb"); if (!file) { strcpy(symbol->errtxt, "Unable to read input file"); return ZERROR_INVALID_DATA; } } do { character = fgetc(file); if(character == '\n') { if(buffer[posn - 1] == '\r') { /* CR+LF - assume Windows formatting and remove CR */ posn--; buffer[posn] = '\0'; } inpos = 0; local_line_count = line_count; memset(number, 0, sizeof(char) * 12); memset(reverse_number, 0, sizeof(char) * 12); memset(reversed_string, 0, sizeof(char) * 127); memset(output_file, 0, sizeof(char) * 127); do { number[inpos] = itoc(local_line_count % 10); local_line_count /= 10; inpos++; } while (local_line_count > 0); number[inpos] = '\0'; for(i = 0; i < inpos; i++) { reverse_number[i] = number[inpos - i - 1]; } format_len = strlen(format_string); for(i = format_len; i > 0; i--) { format_char = format_string[i - 1]; switch(format_char) { case '#': if (inpos > 0) { adjusted[0] = reverse_number[inpos - 1]; inpos--; } else { adjusted[0] = ' '; } break; case '~': if (inpos > 0) { adjusted[0] = reverse_number[inpos - 1]; inpos--; } else { adjusted[0] = '0'; } break; case '@': if (inpos > 0) { adjusted[0] = reverse_number[inpos - 1]; inpos--; } else { adjusted[0] = '*'; } break; default: adjusted[0] = format_string[i - 1]; break; } concat(reversed_string, adjusted); } for(i = 0; i < format_len; i++) { output_file[i] = reversed_string[format_len - i - 1]; } strcpy(symbol->outfile, output_file); error_number = ZBarcode_Encode_and_Print(symbol, buffer, posn, 0); if(error_number != 0) { fprintf(stderr, "On line %d: %s\n", line_count, symbol->errtxt); } ZBarcode_Clear(symbol); memset(buffer, 0, sizeof(unsigned char) * 7100); posn = 0; line_count++; } else { buffer[posn] = character; posn++; } if(posn > 7090) { fprintf(stderr, "On line %d: Input data too long\n", line_count); do { character = fgetc(file); } while((!feof(file)) && (character != '\n')); } } while ((!feof(file)) && (line_count < 2000000000)); if(character != '\n') { fprintf(stderr, "Warning: No newline at end of file\n"); } fclose(file); return error_number; }