/* Allocate resources in request for process i, only if it results in a safe state and return 1, else return 0 */ int resource_request(int i, int *request) { pthread_mutex_lock(&state_mutex); if(islarger(request, s->need[i], n)) { printf("¡¡¡ERROR!!!\n"); printf("Process %i's request is greather than its need.\n", i); killProcesses(); } subArr(s->available, request, n); addArr(s->allocation[i], request, n); subArr(s->need[i], request, n); if (safe_state(s)) { pthread_mutex_unlock(&state_mutex); return 1; } else { addArr(s->available, request, n); subArr(s->allocation[i], request, n); addArr(s->need[i], request, n); pthread_mutex_unlock(&state_mutex); return 0; } }
/*Checks if a given state is safe.*/ int safe_state(State *s) { int count = m, i, isSafe; int *finish = (int *)malloc(n * sizeof(int)); int *work = (int *)malloc(m * sizeof(int)); for (i = 0; i < m; i++) { finish[i] = 0; work[i] = s->available[i]; } while (count != 0) { isSafe = 0; for (i = 0; i < m; i++) { if (!finish[i]) { if (islarger(work, s->need[i], n)) { finish[i] = 1; count--; isSafe = 1; addArr(work, s->allocation[i],n); break; } } } if (!isSafe) { printf("The requested state is unsafe.\n"); return 0; } } printf("The requested state is safe.\n"); return 1; }
/* Release the resources in request for process i */ void resource_release(int i, int *request) { pthread_mutex_lock(&state_mutex); if(islarger(request, s->allocation[i], n)) { printf("¡¡¡ERROR!!!\n"); printf("Process %i tries to release more resources than it has allocated.\n", i); killProcesses(); } addArr(s->available, request, n); subArr(s->allocation[i], request, n); addArr(s->need[i], request, n); pthread_mutex_unlock(&state_mutex); }
int imail(struct zint_symbol *symbol, unsigned char source[], int length) { char data_pattern[200]; int error_number; int i, j, read; char zip[35], tracker[35], zip_adder[11], temp[2]; short int accum[112], x_reg[112], y_reg[112]; unsigned char byte_array[13]; unsigned short usps_crc; int codeword[10]; unsigned short characters[10]; short int bit_pattern[13], bar_map[130]; error_number = 0; if(length > 32) { strcpy(symbol->errtxt, "Input too long"); return ERROR_TOO_LONG; } error_number = is_sane(SODIUM, source, length); if(error_number == ERROR_INVALID_DATA) { strcpy(symbol->errtxt, "Invalid characters in data"); return error_number; } strcpy(zip, ""); strcpy(tracker, ""); /* separate the tracking code from the routing code */ read = 0; j = 0; for(i = 0; i < length; i++) { if(source[i] == '-') { tracker[read] = '\0'; j = 1; read = 0; } else { if(j == 0) { /* reading tracker */ tracker[read] = source[i]; read++; } else { /* reading zip code */ zip[read] = source[i]; read++; } } } if(j == 0) { tracker[read] = '\0'; } else { zip[read] = '\0'; } if(strlen(tracker) != 20) { strcpy(symbol->errtxt, "Invalid length tracking code"); return ERROR_INVALID_DATA; } if(strlen(zip) > 11) { strcpy(symbol->errtxt, "Invalid ZIP code"); return ERROR_INVALID_DATA; } /* *** Step 1 - Conversion of Data Fields into Binary Data *** */ /* Routing code first */ for(i = 0; i < 112; i++) { accum[i] = 0; } for(read = 0; read < strlen(zip); read++) { for(i = 0; i < 112; i++) { x_reg[i] = accum[i]; } for(i = 0; i < 9; i++) { binary_add(accum, x_reg); } x_reg[0] = BCD[ctoi(zip[read]) * 4]; x_reg[1] = BCD[(ctoi(zip[read]) * 4) + 1]; x_reg[2] = BCD[(ctoi(zip[read]) * 4) + 2]; x_reg[3] = BCD[(ctoi(zip[read]) * 4) + 3]; for(i = 4; i < 112; i++) { x_reg[i] = 0; } binary_add(accum, x_reg); } /* add weight to routing code */ for(i = 0; i < 112; i++) { x_reg[i] = accum[i]; } if(strlen(zip) > 9) { strcpy(zip_adder, "1000100001"); } else { if(strlen(zip) > 5) { strcpy(zip_adder, "100001"); } else { if(strlen(zip) > 0) { strcpy(zip_adder, "1"); } else { strcpy(zip_adder, "0"); } } } for(i = 0; i < 112; i++) { accum[i] = 0; } for(read = 0; read < strlen(zip_adder); read++) { for(i = 0; i < 112; i++) { y_reg[i] = accum[i]; } for(i = 0; i < 9; i++) { binary_add(accum, y_reg); } y_reg[0] = BCD[ctoi(zip_adder[read]) * 4]; y_reg[1] = BCD[(ctoi(zip_adder[read]) * 4) + 1]; y_reg[2] = BCD[(ctoi(zip_adder[read]) * 4) + 2]; y_reg[3] = BCD[(ctoi(zip_adder[read]) * 4) + 3]; for(i = 4; i < 112; i++) { y_reg[i] = 0; } binary_add(accum, y_reg); } binary_add(accum, x_reg); /* tracking code */ /* multiply by 10 */ for(i = 0; i < 112; i++) { y_reg[i] = accum[i]; } for(i = 0; i < 9; i++) { binary_add(accum, y_reg); } /* add first digit of tracker */ y_reg[0] = BCD[ctoi(tracker[0]) * 4]; y_reg[1] = BCD[(ctoi(tracker[0]) * 4) + 1]; y_reg[2] = BCD[(ctoi(tracker[0]) * 4) + 2]; y_reg[3] = BCD[(ctoi(tracker[0]) * 4) + 3]; for(i = 4; i < 112; i++) { y_reg[i] = 0; } binary_add(accum, y_reg); /* multiply by 5 */ for(i = 0; i < 112; i++) { y_reg[i] = accum[i]; } for(i = 0; i < 4; i++) { binary_add(accum, y_reg); } /* add second digit */ y_reg[0] = BCD[ctoi(tracker[1]) * 4]; y_reg[1] = BCD[(ctoi(tracker[1]) * 4) + 1]; y_reg[2] = BCD[(ctoi(tracker[1]) * 4) + 2]; y_reg[3] = BCD[(ctoi(tracker[1]) * 4) + 3]; for(i = 4; i < 112; i++) { y_reg[i] = 0; } binary_add(accum, y_reg); /* and then the rest */ for(read = 2; read < strlen(tracker); read++) { for(i = 0; i < 112; i++) { y_reg[i] = accum[i]; } for(i = 0; i < 9; i++) { binary_add(accum, y_reg); } y_reg[0] = BCD[ctoi(tracker[read]) * 4]; y_reg[1] = BCD[(ctoi(tracker[read]) * 4) + 1]; y_reg[2] = BCD[(ctoi(tracker[read]) * 4) + 2]; y_reg[3] = BCD[(ctoi(tracker[read]) * 4) + 3]; for(i = 4; i < 112; i++) { y_reg[i] = 0; } binary_add(accum, y_reg); } /* printf("Binary data 1: "); hex_dump(accum); */ /* *** Step 2 - Generation of 11-bit CRC on Binary Data *** */ accum[103] = 0; accum[102] = 0; memset(byte_array, 0, 13); for(j = 0; j < 13; j++) { i = 96 - (8 * j); byte_array[j] = 0; byte_array[j] += accum[i]; byte_array[j] += 2 * accum[i + 1]; byte_array[j] += 4 * accum[i + 2]; byte_array[j] += 8 * accum[i + 3]; byte_array[j] += 16 * accum[i + 4]; byte_array[j] += 32 * accum[i + 5]; byte_array[j] += 64 * accum[i + 6]; byte_array[j] += 128 * accum[i + 7]; } usps_crc = USPS_MSB_Math_CRC11GenerateFrameCheckSequence(byte_array); /* printf("FCS 2: %4.4X\n", usps_crc); */ /* *** Step 3 - Conversion from Binary Data to Codewords *** */ /* start with codeword J which is base 636 */ for(i = 0; i < 112; i++) { x_reg[i] = 0; y_reg[i] = 0; } x_reg[101] = 1; x_reg[98] = 1; x_reg[97] = 1; x_reg[96] = 1; x_reg[95] = 1; x_reg[94] = 1; for(i = 92; i >= 0; i--) { y_reg[i] = islarger(accum, x_reg); if(y_reg[i] == 1) { binary_subtract(accum, x_reg); } shiftdown(x_reg); } codeword[9] = (accum[9] * 512) + (accum[8] * 256) + (accum[7] * 128) + (accum[6] * 64) + (accum[5] * 32) + (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) + (accum[1] * 2) + accum[0]; /* then codewords I to B with base 1365 */ for(j = 8; j > 0; j--) { for(i = 0; i < 112; i++) { accum[i] = y_reg[i]; y_reg[i] = 0; x_reg[i] = 0; } x_reg[101] = 1; x_reg[99] = 1; x_reg[97] = 1; x_reg[95] = 1; x_reg[93] = 1; x_reg[91] = 1; for(i = 91; i >= 0; i--) { y_reg[i] = islarger(accum, x_reg); if(y_reg[i] == 1) { binary_subtract(accum, x_reg); } shiftdown(x_reg); } codeword[j] = (accum[10] * 1024) + (accum[9] * 512) + (accum[8] * 256) + (accum[7] * 128) + (accum[6] * 64) + (accum[5] * 32) + (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) + (accum[1] * 2) + accum[0]; } codeword[0] = (y_reg[10] * 1024) + (y_reg[9] * 512) + (y_reg[8] * 256) + (y_reg[7] * 128) + (y_reg[6] * 64) + (y_reg[5] * 32) + (y_reg[4] * 16) + (y_reg[3] * 8) + (y_reg[2] * 4) + (y_reg[1] * 2) + y_reg[0]; for(i = 0; i < 8; i++) { if(codeword[i] == 1365) { codeword[i] = 0; codeword[i + 1]++; } } /* printf("Codewords 3: "); for(i = 0; i < 10; i++) { printf("%d ", codeword[i]); } printf("\n"); */ /* *** Step 4 - Inserting Additional Information into Codewords *** */ codeword[9] = codeword[9] * 2; if(usps_crc >= 1024) { codeword[0] += 659; } /* printf("Codewords 4b: "); for(i = 0; i < 10; i++) { printf("%d ", codeword[i]); } printf("\n"); */ /* *** Step 5 - Conversion from Codewords to Characters *** */ for(i = 0; i < 10; i++) { if(codeword[i] < 1287) { characters[i] = AppxD_I[codeword[i]]; } else { characters[i] = AppxD_II[codeword[i] - 1287]; } } /* printf("Characters 5a: "); for(i = 0; i < 10; i++) { printf("%4.4X ", characters[i]); } printf("\n"); */ breakup(bit_pattern, usps_crc); for(i = 0; i < 10; i++) { if(bit_pattern[i] == 1) { characters[i] = 0x1FFF - characters[i]; } } /* printf("Characters 5b: "); for(i = 0; i < 10; i++) { printf("%4.4X ", characters[i]); } printf("\n"); */ /* *** Step 6 - Conversion from Characters to the Intelligent Mail Barcode *** */ for(i = 0; i < 10; i++) { breakup(bit_pattern, characters[i]); for(j = 0; j < 13; j++) { bar_map[AppxD_IV[(13 * i) + j] - 1] = bit_pattern[j]; } } strcpy(data_pattern, ""); temp[1] = '\0'; for(i = 0; i < 65; i++) { j = 0; if(bar_map[i] == 0) j += 1; if(bar_map[i + 65] == 0) j += 2; temp[0] = itoc(j); concat(data_pattern, temp); } /* Translate 4-state data pattern to symbol */ read = 0; for(i = 0; i < strlen(data_pattern); i++) { if((data_pattern[i] == '1') || (data_pattern[i] == '0')) { set_module(symbol, 0, read); } set_module(symbol, 1, read); if((data_pattern[i] == '2') || (data_pattern[i] == '0')) { set_module(symbol, 2, read); } read += 2; } symbol->row_height[0] = 3; symbol->row_height[1] = 2; symbol->row_height[2] = 3; symbol->rows = 3; symbol->width = read - 1; return error_number; }