Esempio n. 1
0
File: banker.c Progetto: Jelb/BOSC
/* 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;
    }
}
Esempio n. 2
0
File: banker.c Progetto: Jelb/BOSC
/*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;
}
Esempio n. 3
0
File: banker.c Progetto: Jelb/BOSC
/* 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);
}
Esempio n. 4
0
File: imail.c Progetto: DroiDev/zint
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;
}