int rss_binary_string()

in Sharing/Src/External/zint-2.4.3/src/backend/rss.c [1071:1861]


int rss_binary_string(struct zint_symbol *symbol, char source[], char binary_string[])
{ /* Handles all data encodation from section 7.2.5 of ISO/IEC 24724 */
	int encoding_method, i, mask, j, read_posn, latch, debug = 0, last_mode = ISOIEC;
#ifndef _MSC_VER
	char general_field[strlen(source)], general_field_type[strlen(source)];
#else
	char* general_field = (char*)_alloca(strlen(source));
        char* general_field_type = (char*)_alloca(strlen(source));
#endif
	int remainder, d1, d2, value;
	char padstring[40];

	read_posn=0;
	value=0;

	/* Decide whether a compressed data field is required and if so what
	method to use - method 2 = no compressed data field */
	
	if((strlen(source) >= 16) && ((source[0] == '0') && (source[1] == '1'))) {
		/* (01) and other AIs */
		encoding_method = 1;
		if(debug) printf("Choosing Method 1\n");
	} else {
		/* any AIs */
		encoding_method = 2;
		if(debug) printf("Choosing Mehod 2\n");
	}
	
	if(((strlen(source) >= 20) && (encoding_method == 1)) && ((source[2] == '9') && (source[16] == '3'))) {
		/* Possibly encoding method > 2 */
		if(debug) printf("Checking for other methods\n");
		
		if((strlen(source) >= 26) && (source[17] == '1')) {
			/* Methods 3, 7, 9, 11 and 13 */
			
			if(source[18] == '0') {
				/* (01) and (310x) */
				char weight_str[7];
				float weight; /* In kilos */
			
				for(i = 0; i < 6; i++) {
					weight_str[i] = source[20 + i];
				}
				weight_str[6] = '\0';
				
				if (weight_str[0] == '0') { /* Maximum weight = 99999 */


					encoding_method = 7;
					
					if((source[19] == '3') && (strlen(source) == 26)) {
						/* (01) and (3103) */
						weight = atof(weight_str) / 1000.0;
						
						if(weight <= 32.767) { encoding_method = 3; }
					}
					
					if(strlen(source) == 34){
						if((source[26] == '1') && (source[27] == '1')) {
							/* (01), (310x) and (11) - metric weight and production date */
							encoding_method = 7;
						}
						
						if((source[26] == '1') && (source[27] == '3')) {
							/* (01), (310x) and (13) - metric weight and packaging date */
							encoding_method = 9;
						}
						
						if((source[26] == '1') && (source[27] == '5')) {
							/* (01), (310x) and (15) - metric weight and "best before" date */
							encoding_method = 11;
						}
						
						if((source[26] == '1') && (source[27] == '7')) {
							/* (01), (310x) and (17) - metric weight and expiration date */
							encoding_method = 13;
						}
					}
				}
			}
			if(debug) printf("Now using method %d\n", encoding_method);
		}
		
		if((strlen(source) >= 26) && (source[17] == '2')) {
			/* Methods 4, 8, 10, 12 and 14 */
			
			if(source[18] == '0') {
				/* (01) and (320x) */
				char weight_str[7];
				float weight; /* In pounds */
			
				for(i = 0; i < 6; i++) {
					weight_str[i] = source[20 + i];
				}
				weight_str[6] = '\0';
				
				if (weight_str[0] == '0') { /* Maximum weight = 99999 */

					encoding_method = 8;
					
					if(((source[19] == '2') || (source[19] == '3')) && (strlen(source) == 26)) {
						/* (01) and (3202)/(3203) */
						
						if(source[19] == '3') {
							weight = atof(weight_str) / 1000.0;
							if(weight <= 22.767) {
								encoding_method = 4;
							}
						} else {
							weight = atof(weight_str) / 100.0;
							if(weight <= 99.99) {
								encoding_method = 4;
							}
						}
						
					}
					
					if(strlen(source) == 34){
						if((source[26] == '1') && (source[27] == '1')) {
							/* (01), (320x) and (11) - English weight and production date */
							encoding_method = 8;
						}
						
						if((source[26] == '1') && (source[27] == '3')) {
							/* (01), (320x) and (13) - English weight and packaging date */
							encoding_method = 10;
						}
						
						if((source[26] == '1') && (source[27] == '5')) {
							/* (01), (320x) and (15) - English weight and "best before" date */
							encoding_method = 12;
						}
						
						if((source[26] == '1') && (source[27] == '7')) {
							/* (01), (320x) and (17) - English weight and expiration date */
							encoding_method = 14;
						}
					}
				}
			}
			if(debug) printf("Now using method %d\n", encoding_method);

		}
		
		if(source[17] == '9') {
			/* Methods 5 and 6 */
			if((source[18] == '2') && ((source[19] >= '0') && (source[19] <= '3'))) {
				/* (01) and (392x) */
				encoding_method = 5;
			}
			if((source[18] == '3') && ((source[19] >= '0') && (source[19] <= '3'))) {
				/* (01) and (393x) */
				encoding_method = 6;
			}
			if(debug) printf("Now using method %d\n", encoding_method);
		}
	}
	
	switch(encoding_method) { /* Encoding method - Table 10 */
		case 1: concat(binary_string, "1XX"); read_posn = 16; break;
		case 2: concat(binary_string, "00XX"); read_posn = 0; break;
		case 3: concat(binary_string, "0100"); read_posn = strlen(source); break;
		case 4: concat(binary_string, "0101"); read_posn = strlen(source); break;
		case 5: concat(binary_string, "01100XX"); read_posn = 20; break;
		case 6: concat(binary_string, "01101XX"); read_posn = 23; break;
		case 7: concat(binary_string, "0111000"); read_posn = strlen(source); break;
		case 8: concat(binary_string, "0111001"); read_posn = strlen(source); break;
		case 9: concat(binary_string, "0111010"); read_posn = strlen(source); break;
		case 10: concat(binary_string, "0111011"); read_posn = strlen(source); break;
		case 11: concat(binary_string, "0111100"); read_posn = strlen(source); break;
		case 12: concat(binary_string, "0111101"); read_posn = strlen(source); break;
		case 13: concat(binary_string, "0111110"); read_posn = strlen(source); break;
		case 14: concat(binary_string, "0111111"); read_posn = strlen(source); break;
	}
	if(debug) printf("Setting binary = %s\n", binary_string);
	
	/* Variable length symbol bit field is just given a place holder (XX)
	for the time being */
	
	/* Verify that the data to be placed in the compressed data field is all
	numeric data before carrying out compression */
	for(i = 0; i < read_posn; i++) {
		if((source[i] < '0') || (source[i] > '9')) {
			if((source[i] != '[') && (source[i] != ']')) {
				/* Something is wrong */
				strcpy(symbol->errtxt, "Invalid characters in input data");
				return ZINT_ERROR_INVALID_DATA;
			}
		}
	}
	
	/* Now encode the compressed data field */
	
	if(debug) printf("Proceeding to encode data\n");
	if(encoding_method == 1) {
		/* Encoding method field "1" - general item identification data */
		char group[4];
		int group_val;
		
		group[0] = source[2];
		group[1] = '\0';
		group_val = atoi(group);
		
		mask = 0x08;
		for(j = 0; j < 4; j++) {
			concat(binary_string, (group_val & mask) ? "1" : "0");
			mask = mask >> 1;
		}
		
		for(i = 1; i < 5; i++) {
			group[0] = source[(i * 3)];
			group[1] = source[(i * 3) + 1];
			group[2] = source[(i * 3) + 2];
			group[3] = '\0';
			group_val = atoi(group);
			
			mask = 0x200;
			for(j = 0; j < 10; j++) {
				concat(binary_string, (group_val & mask) ? "1" : "0");
				mask = mask >> 1;
			}
		}
		
		
	}
	
	
	if(encoding_method == 3) {
		/* Encoding method field "0100" - variable weight item
		(0,001 kilogram icrements) */
		char group[4];
		int group_val;
		char weight_str[7];
		
		for(i = 1; i < 5; i++) {
			group[0] = source[(i * 3)];
			group[1] = source[(i * 3) + 1];
			group[2] = source[(i * 3) + 2];
			group[3] = '\0';
			group_val = atoi(group);
			
			mask = 0x200;
			for(j = 0; j < 10; j++) {
				concat(binary_string, (group_val & mask) ? "1" : "0");
				mask = mask >> 1;
			}
		}
			
		for(i = 0; i < 6; i++) {
			weight_str[i] = source[20 + i];
		}
		weight_str[6] = '\0';
		group_val = atoi(weight_str);
		
		mask = 0x4000;
		for(j = 0; j < 15; j++) {
			concat(binary_string, (group_val & mask) ? "1" : "0");
			mask = mask >> 1;
		}
		
		
	}
	
	if(encoding_method == 4) {
		/* Encoding method field "0101" - variable weight item (0,01 or
		0,001 pound increment) */
		char group[4];
		int group_val;
		char weight_str[7];
		
		for(i = 1; i < 5; i++) {
			group[0] = source[(i * 3)];
			group[1] = source[(i * 3) + 1];
			group[2] = source[(i * 3) + 2];
			group[3] = '\0';
			group_val = atoi(group);
			
			mask = 0x200;
			for(j = 0; j < 10; j++) {
				concat(binary_string, (group_val & mask) ? "1" : "0");
				mask = mask >> 1;
			}
		}
			
		for(i = 0; i < 6; i++) {
			weight_str[i] = source[20 + i];
		}
		weight_str[6] = '\0';
		group_val = atoi(weight_str);

		if(source[19] == '3') {
			group_val = group_val + 10000;
		}
		
		mask = 0x4000;
		for(j = 0; j < 15; j++) {
			concat(binary_string, (group_val & mask) ? "1" : "0");
			mask = mask >> 1;
		}
		
	}
		
	
	if((encoding_method >= 7) && (encoding_method <= 14)) {
		/* Encoding method fields "0111000" through "0111111" - variable
		weight item plus date */
		char group[4];
		int group_val;
		char weight_str[8];
		char date_str[4];
		
		for(i = 1; i < 5; i++) {
			group[0] = source[(i * 3)];
			group[1] = source[(i * 3) + 1];
			group[2] = source[(i * 3) + 2];
			group[3] = '\0';
			group_val = atoi(group);
			
			mask = 0x200;
			for(j = 0; j < 10; j++) {
				concat(binary_string, (group_val & mask) ? "1" : "0");
				mask = mask >> 1;
			}
		}
		
		weight_str[0] = source[19];
		
		for(i = 0; i < 5; i++) {
			weight_str[i + 1] = source[21 + i];
		}
		weight_str[6] = '\0';
		group_val = atoi(weight_str);
		
		mask = 0x80000;
		for(j = 0; j < 20; j++) {
			concat(binary_string, (group_val & mask) ? "1" : "0");
			mask = mask >> 1;
		}
		
		if(strlen(source) == 34) {
			/* Date information is included */
			date_str[0] = source[28];
			date_str[1] = source[29];
			date_str[2] = '\0';
			group_val = atoi(date_str) * 384;
			
			date_str[0] = source[30];
			date_str[1] = source[31];
			group_val += (atoi(date_str) - 1) * 32;
			
			date_str[0] = source[32];
			date_str[1] = source[33];
			group_val += atoi(date_str);
		} else {
			group_val = 38400;
		}
		
		mask = 0x8000;
		for(j = 0; j < 16; j++) {
			concat(binary_string, (group_val & mask) ? "1" : "0");
			mask = mask >> 1;
		}
		
	}
	
	if(encoding_method == 5) {
		/* Encoding method field "01100" - variable measure item and price */
		char group[4];
		int group_val;
		
		for(i = 1; i < 5; i++) {
			group[0] = source[(i * 3)];
			group[1] = source[(i * 3) + 1];
			group[2] = source[(i * 3) + 2];
			group[3] = '\0';
			group_val = atoi(group);
			
			mask = 0x200;
			for(j = 0; j < 10; j++) {
				concat(binary_string, (group_val & mask) ? "1" : "0");
				mask = mask >> 1;
			}
		}
		
		switch(source[19]) {
			case '0': concat(binary_string, "00"); break;
			case '1': concat(binary_string, "01"); break;
			case '2': concat(binary_string, "10"); break;
			case '3': concat(binary_string, "11"); break;
		}
	}
	
	if(encoding_method == 6) {
		/* Encoding method "01101" - variable measure item and price with ISO 4217
		Currency Code */
		
		char group[4];
		int group_val;
		char currency_str[5];
		
		for(i = 1; i < 5; i++) {
			group[0] = source[(i * 3)];
			group[1] = source[(i * 3) + 1];
			group[2] = source[(i * 3) + 2];
			group[3] = '\0';
			group_val = atoi(group);
			
			mask = 0x200;
			for(j = 0; j < 10; j++) {
				concat(binary_string, (group_val & mask) ? "1" : "0");
				mask = mask >> 1;
			}
		}
		
		switch(source[19]) {
			case '0': concat(binary_string, "00"); break;
			case '1': concat(binary_string, "01"); break;
			case '2': concat(binary_string, "10"); break;
			case '3': concat(binary_string, "11"); break;
		}
		
		for(i = 0; i < 3; i++) {
			currency_str[i] = source[20 + i];
		}
		currency_str[3] = '\0';
		group_val = atoi(currency_str);
		
		mask = 0x200;
		for(j = 0; j < 10; j++) {
			concat(binary_string, (group_val & mask) ? "1" : "0");
			mask = mask >> 1;
		}
		
		
	}
	
	/* The compressed data field has been processed if appropriate - the
	rest of the data (if any) goes into a general-purpose data compaction field */
	
	j = 0;
	for(i = read_posn; i < strlen(source); i++) {
		general_field[j] = source[i];
		j++;
	}
	general_field[j] = '\0';
	if(debug) printf("General field data = %s\n", general_field);
	
	latch = 0;
	for(i = 0; i < strlen(general_field); i++) {
		/* Table 13 - ISO/IEC 646 encodation */
		if((general_field[i] < ' ') || (general_field[i] > 'z')) {
			general_field_type[i] = INVALID_CHAR; latch = 1;
		} else {
			general_field_type[i] = ISOIEC;
		}
		
		if(general_field[i] == '#') {
			general_field_type[i] = INVALID_CHAR; latch = 1;
		}
		if(general_field[i] == '$') {
			general_field_type[i] = INVALID_CHAR; latch = 1;
		}
		if(general_field[i] == '@') {
			general_field_type[i] = INVALID_CHAR; latch = 1;
		}
		if(general_field[i] == 92) {
			general_field_type[i] = INVALID_CHAR; latch = 1;
		}
		if(general_field[i] == '^') {
			general_field_type[i] = INVALID_CHAR; latch = 1;
		}
		if(general_field[i] == 96) {
			general_field_type[i] = INVALID_CHAR; latch = 1;
		}

		/* Table 12 - Alphanumeric encodation */
		if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
			general_field_type[i] = ALPHA_OR_ISO;
		}
		if(general_field[i] == '*') {
			general_field_type[i] = ALPHA_OR_ISO;
		}
		if(general_field[i] == ',') {
			general_field_type[i] = ALPHA_OR_ISO;
		}
		if(general_field[i] == '-') {
			general_field_type[i] = ALPHA_OR_ISO;
		}
		if(general_field[i] == '.') {
			general_field_type[i] = ALPHA_OR_ISO;
		}
		if(general_field[i] == '/') {
			general_field_type[i] = ALPHA_OR_ISO;
		}

		/* Numeric encodation */
		if((general_field[i] >= '0') && (general_field[i] <= '9')) {
			general_field_type[i] = ANY_ENC;
		}
		if(general_field[i] == '[') {
			/* FNC1 can be encoded in any system */
			general_field_type[i] = ANY_ENC;
		}

	}
	
	general_field_type[strlen(general_field)] = '\0';
	if(debug) printf("General field type: %s\n", general_field_type);
	
	if(latch == 1) {
		/* Invalid characters in input data */
		strcpy(symbol->errtxt, "Invalid characters in input data");
		return ZINT_ERROR_INVALID_DATA;
	}
	
	for(i = 0; i < strlen(general_field); i++) {
		if((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) {
			general_field_type[i + 1] = ISOIEC;
		}
	}
	
	for(i = 0; i < strlen(general_field); i++) {
		if((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) {
			general_field_type[i + 1] = ALPHA_OR_ISO;
		}
	}
	
	latch = general_rules(general_field, general_field_type);
	if(debug) printf("General field type: %s\n", general_field_type);
	
	last_mode = NUMERIC;
	
	/* Set initial mode if not NUMERIC */
	if(general_field_type[0] == ALPHA) {
		concat(binary_string, "0000"); /* Alphanumeric latch */
		last_mode = ALPHA;
	}
	if(general_field_type[0] == ISOIEC) {
		concat(binary_string, "0000"); /* Alphanumeric latch */
		concat(binary_string, "00100"); /* ISO/IEC 646 latch */
		last_mode = ISOIEC;
	}
	
	i = 0;
	do {
		if(debug) printf("Processing character %d ", i);
		switch(general_field_type[i]) {
			case NUMERIC:
				if(debug) printf("as NUMERIC:");
				
				if(last_mode != NUMERIC) {
					concat(binary_string, "000"); /* Numeric latch */
					if(debug) printf("<NUMERIC LATCH>\n");
				}
				
				if(debug) printf("  %c%c > ", general_field[i], general_field[i + 1]);
				if(general_field[i] != '[') {
					d1 = ctoi(general_field[i]);
				} else {
					d1 = 10;
				}
				
				if(general_field[i + 1] != '[') {
					d2 = ctoi(general_field[i + 1]);
				} else {
					d2 = 10;
				}
				
				value = (11 * d1) + d2 + 8;
				
				mask = 0x40;
				for(j = 0; j < 7; j++) {
					concat(binary_string, (value & mask) ? "1" : "0");
					if (debug) {
						printf("%d", !!(value & mask));
					}
					mask = mask >> 1;
				}
				
				i += 2;
				if(debug) printf("\n");
				last_mode = NUMERIC;
				break;
			
			case ALPHA:
				if(debug) printf("as ALPHA\n");
				if(i != 0) {
					if(last_mode == NUMERIC) {
						concat(binary_string, "0000"); /* Alphanumeric latch */
					}
					if(last_mode == ISOIEC) {
						concat(binary_string, "00100"); /* Alphanumeric latch */
					}
				}
				
				if((general_field[i] >= '0') && (general_field[i] <= '9')) {
					
					value = general_field[i] - 43;
					
					mask = 0x10;
					for(j = 0; j < 5; j++) {
						concat(binary_string, (value & mask) ? "1" : "0");
						mask = mask >> 1;
					}
				}
				
				if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
					
					value = general_field[i] - 33;
					
					mask = 0x20;
					for(j = 0; j < 6; j++) {
						concat(binary_string, (value & mask) ? "1" : "0");
						mask = mask >> 1;
					}
				}
				
				last_mode = ALPHA;
				if(general_field[i] == '[') { concat(binary_string, "01111"); last_mode = NUMERIC; } /* FNC1/Numeric latch */
				if(general_field[i] == '*') concat(binary_string, "111010"); /* asterisk */
				if(general_field[i] == ',') concat(binary_string, "111011"); /* comma */
				if(general_field[i] == '-') concat(binary_string, "111100"); /* minus or hyphen */
				if(general_field[i] == '.') concat(binary_string, "111101"); /* period or full stop */
				if(general_field[i] == '/') concat(binary_string, "111110"); /* slash or solidus */
				
				i++;
				break;
			
			case ISOIEC:
				if(debug) printf("as ISOIEC\n");
				if(i != 0) {
					if(last_mode == NUMERIC) {
						concat(binary_string, "0000"); /* Alphanumeric latch */
						concat(binary_string, "00100"); /* ISO/IEC 646 latch */
					}
					if(last_mode == ALPHA) {
						concat(binary_string, "00100"); /* ISO/IEC 646 latch */
					}
				}
				
				if((general_field[i] >= '0') && (general_field[i] <= '9')) {
					
					value = general_field[i] - 43;
					
					mask = 0x10;
					for(j = 0; j < 5; j++) {
						concat(binary_string, (value & mask) ? "1" : "0");
						mask = mask >> 1;
					}
				}
				
				if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
					
					value = general_field[i] - 1;
					
					mask = 0x40;
					for(j = 0; j < 7; j++) {
						concat(binary_string, (value & mask) ? "1" : "0");
						mask = mask >> 1;
					}
				}
				
				if((general_field[i] >= 'a') && (general_field[i] <= 'z')) {
					
					value = general_field[i] - 7;
					
					mask = 0x40;
					for(j = 0; j < 7; j++) {
						concat(binary_string, (value & mask) ? "1" : "0");
						mask = mask >> 1;
					}
				}
				
				last_mode = ISOIEC;
				if(general_field[i] == '[') { concat(binary_string, "01111"); last_mode = NUMERIC; } /* FNC1/Numeric latch */
				if(general_field[i] == '!') concat(binary_string, "11101000"); /* exclamation mark */
				if(general_field[i] == 34) concat(binary_string, "11101001"); /* quotation mark */
				if(general_field[i] == 37) concat(binary_string, "11101010"); /* percent sign */
				if(general_field[i] == '&') concat(binary_string, "11101011"); /* ampersand */
				if(general_field[i] == 39) concat(binary_string, "11101100"); /* apostrophe */
				if(general_field[i] == '(') concat(binary_string, "11101101"); /* left parenthesis */
				if(general_field[i] == ')') concat(binary_string, "11101110"); /* right parenthesis */
				if(general_field[i] == '*') concat(binary_string, "11101111"); /* asterisk */
				if(general_field[i] == '+') concat(binary_string, "11110000"); /* plus sign */
				if(general_field[i] == ',') concat(binary_string, "11110001"); /* comma */
				if(general_field[i] == '-') concat(binary_string, "11110010"); /* minus or hyphen */
				if(general_field[i] == '.') concat(binary_string, "11110011"); /* period or full stop */
				if(general_field[i] == '/') concat(binary_string, "11110100"); /* slash or solidus */
				if(general_field[i] == ':') concat(binary_string, "11110101"); /* colon */
				if(general_field[i] == ';') concat(binary_string, "11110110"); /* semicolon */
				if(general_field[i] == '<') concat(binary_string, "11110111"); /* less-than sign */
				if(general_field[i] == '=') concat(binary_string, "11111000"); /* equals sign */
				if(general_field[i] == '>') concat(binary_string, "11111001"); /* greater-than sign */
				if(general_field[i] == '?') concat(binary_string, "11111010"); /* question mark */
				if(general_field[i] == '_') concat(binary_string, "11111011"); /* underline or low line */
				if(general_field[i] == ' ') concat(binary_string, "11111100"); /* space */
				
				i++;
				break;
		}
	} while (i + latch < strlen(general_field));
	if(debug) printf("Resultant binary = %s\n", binary_string);
	if(debug) printf("\tLength: %d\n", (int)strlen(binary_string));
	
	remainder = 12 - (strlen(binary_string) % 12);
	if(remainder == 12) { remainder = 0; }
	if(strlen(binary_string) < 36) { remainder = 36 - strlen(binary_string); }

	if(latch == 1) {
		/* There is still one more numeric digit to encode */
		if(debug) printf("Adding extra (odd) numeric digit\n");
		
		if(last_mode == NUMERIC) {
			if((remainder >= 4) && (remainder <= 6)) {
				value = ctoi(general_field[i]);
				value++;
				
				mask = 0x08;
				for(j = 0; j < 4; j++) {
					concat(binary_string, (value & mask) ? "1" : "0");
					mask = mask >> 1;
				}
			} else {
				d1 = ctoi(general_field[i]);
				d2 = 10;
					
				value = (11 * d1) + d2 + 8;
					
				mask = 0x40;
				for(j = 0; j < 7; j++) {
					concat(binary_string, (value & mask) ? "1" : "0");
					mask = mask >> 1;
				}
			}
		} else {
			value = general_field[i] - 43;
					
			mask = 0x10;
			for(j = 0; j < 5; j++) {
				concat(binary_string, (value & mask) ? "1" : "0");
				mask = mask >> 1;
			}
		}
		
		remainder = 12 - (strlen(binary_string) % 12);
		if(remainder == 12) { remainder = 0; }
		if(strlen(binary_string) < 36) { remainder = 36 - strlen(binary_string); }
		if(debug) printf("Resultant binary = %s\n", binary_string);
		if(debug) printf("\tLength: %d\n", (int)strlen(binary_string));
	}
	
	if(strlen(binary_string) > 252) {
		strcpy(symbol->errtxt, "Input too long");
		return ZINT_ERROR_TOO_LONG;
	}
	
	/* Now add padding to binary string (7.2.5.5.4) */
	i = remainder;
	if((strlen(general_field) != 0) && (last_mode == NUMERIC)) {
		strcpy(padstring, "0000");
		i -= 4;
	} else {
		strcpy(padstring, "");
	}
	for(;i > 0;i -= 5) {
		concat(padstring, "00100");
	}

	padstring[remainder] = '\0';
	concat(binary_string, padstring);
	
	/* Patch variable length symbol bit field */
	d1 = ((strlen(binary_string) / 12) + 1) & 1;
	if(strlen(binary_string) <= 156) { d2 = 0; } else { d2 = 1; }
	
	if(encoding_method == 1) {
		binary_string[2] = d1 ? '1' : '0';
		binary_string[3] = d2 ? '1' : '0';
	}
	if(encoding_method == 2) {
		binary_string[3] = d1 ? '1' : '0';
		binary_string[4] = d2 ? '1' : '0';
	}
	if((encoding_method == 5) || (encoding_method == 6)) {
		binary_string[6] = d1 ? '1' : '0';
		binary_string[7] = d2 ? '1' : '0';
	}
	if(debug) printf("Resultant binary = %s\n", binary_string);
	if(debug) printf("\tLength: %d\n", (int)strlen(binary_string));
	return 0;
}