Beispiel #1
0
/**
 * Just prepares the isr-callback and IO-request array.
 */
void _ps2_keyboard_init( void ){

	// temp vars
	Status status;

	// For simplicity, null-out the io-requests
	ps2_io_req *req;
	int i;
	for( i = 0; i < TOTAL_IO_REQS; i++){
		req = requests[i];
		req->pid = 0;
		req->buf = 0;
		req->size = -1;
		req->index = -1;
	}

	// Create the Buffered-Blocking Process Queue
	status = _q_alloc( &_buf_block, NULL );
	if( status != SUCCESS ) {
		prt_status( "keyboard, init: Unable to create buf_block queue for IO"
					" requests, keyboard input disabled!\n Error: %s\n", 
					status);
	}


	// install our ISR
	__install_isr( PS2_K_VEC, _ps2_keyboard_isr );
}
Beispiel #2
0
/**
 * Removes the PCB from the buf_block queue. Note, the PCB of the process is
 * still returned even if the PCB could not be removed from the buf_block
 * queue, but the PCB may be 0 if the corresponding process could not be found.
 *
 * @param	index		The index in the requests array of the process to 
 *						remove.
 * returns				The PCB of the process that was removed, or 0 if the
 *						index was too large. Note, the PCB returned may be 0
 *						if the corresponding process could not be found.
 */
Pcb *_ps2_remove_from_queue( Uint8 index ){
	if( index >= TOTAL_IO_REQS )
		return 0;
	void *data;
	Key key;
	key.u = requests[ index ]->pid;
	Status status = _q_remove_by_key( _buf_block, &data, key );
	Pcb *pcb = ( Pcb* ) data;
	if( status != SUCCESS ){
		prt_status( "keyboard, write active: Unable to remove process"
				" in buf block queue!\nError: %s\n", status);
	}
	return pcb;
}
Beispiel #3
0
int             main(int argc, char **argv, char **env)
{
    financial_info  fininfo;
    amort_sched     amortsched;

    set_default(&fininfo);
    fininfo.prec = 2;

    fininfo.npp = 360;
    fininfo.ir = 8.25;
    fininfo.pv = 345725.0;

    (void)fi_calc_payment(&fininfo);
    printf("With npp == %u\n     ir == %.*f\n     pv == %.*f\n", fininfo.npp, fininfo.prec, fininfo.ir, fininfo.prec, fininfo.pv);
    printf("------------>Compute pmt: -2597.32\n");
    prt_status(&fininfo,
               stdout);

    fi_calc_interest(&fininfo);
    printf("\n------------>Compute ir\n");
    prt_status(&fininfo,
               stdout);

    fi_calc_num_payments(&fininfo);
    printf("\n------------>Compute npp\n");
    prt_status(&fininfo,
               stdout);

    fi_calc_future_value(&fininfo);
    printf("\n------------>Compute fv\n");
    prt_status(&fininfo,
               stdout);

    set_default(&fininfo);

    fininfo.npp = 360;
    fininfo.ir = 8.25;
    fininfo.pv = 345725.0;
    fi_calc_payment(&fininfo);

    printf("\n\n Reset financial variables and compute amortization schedules.\n");
    printf("First Schedule - ignore delay in first payment and\noutput annual summary\n");

    amortsched.n = fininfo.npp;
    amortsched.nint = fininfo.ir;
    amortsched.pv = fininfo.pv;
    amortsched.pmt = fininfo.pmt;
    amortsched.fv = fininfo.fv;
    amortsched.CF = fininfo.CF;
    amortsched.PF = fininfo.PF;
    amortsched.disc = fininfo.disc;
    amortsched.bep = fininfo.bep;
    amortsched.prec = fininfo.prec;
    amortsched.year_E = 1999;
    amortsched.month_E = 6;
    amortsched.day_E = 15;
    amortsched.year_I = 1999;
    amortsched.month_I = 8;
    amortsched.day_I = 1;
    amortsched.fixed_pmt = -400;

    (void)Amortization_init(&amortsched);

    amortsched.option = 3;
    amortsched.summary = 'y';
    (void)Amortization_Schedule(&amortsched);
    prt_amortization_schedule(&amortsched, stdout);

    printf("\n\nSecond Schedule - ignore delay in first payment and\noutput schedule for each payment\n");
    amortsched.summary = 'p';
    (void)Amortization_Schedule(&amortsched);
    prt_amortization_schedule(&amortsched, stdout);


    printf("\n\nThird Schedule - ignore delay in first payment and\noutput variable advanced prepayment schedule\n");
    amortsched.summary = 'a';
    (void)Amortization_Schedule(&amortsched);
    prt_amortization_schedule(&amortsched, stdout);

    printf("\n\nFourth Schedule - ignore delay in first payment and\noutput fixed prepayment schedule\n");
    amortsched.summary = 'f';
    (void)Amortization_Schedule(&amortsched);
    prt_amortization_schedule(&amortsched, stdout);

    printf("\n\nFifth Schedule - use new payments due to delay and\noutput annual summary\n");
    amortsched.option = 5;
    amortsched.summary = 'y';
    (void)Amortization_Schedule(&amortsched);
    prt_amortization_schedule(&amortsched, stdout);

    printf("\n\nSixth Schedule - use new payments due to delay and\noutput periodic payment schedule\n");
    amortsched.option = 5;
    amortsched.summary = 'p';
    (void)Amortization_Schedule(&amortsched);
    prt_amortization_schedule(&amortsched, stdout);

    printf("\n\nSeventh Schedule - use new payments due to delay and\noutput variable prepayment schedule\n");
    amortsched.option = 5;
    amortsched.summary = 'a';
    (void)Amortization_Schedule(&amortsched);
    prt_amortization_schedule(&amortsched, stdout);

    printf("\n\nEighth Schedule - use new payments due to delay and\noutput fixed prepayment schedule\n");
    amortsched.option = 5;
    amortsched.summary = 'f';
    (void)Amortization_Schedule(&amortsched);
    prt_amortization_schedule(&amortsched, stdout);
    Amortization_free(&amortsched);
} /* main */
int             main(int argc, char **argv, char **env)
{
    char   buffer[200], *errp;
    size_t          sbuf;
    size_t          retcnt;
    var_store       value;
    var_store_ptr   value_list;
    numeric_ptr     nval;
    unsigned        compute,
           jj,
           yrE,
           monthE,
           dayE,
           yrI,
           monthI,
           dayI;
    struct tm      *times_E,
            *times_I;
    void           *parse_env;
    amort_sched     amortsched;
    financial_info  fininfo;

    /* check dynamic storage allocation
     */
    /*  	mtrace();	*/
    set_default(&fininfo);
    set_fin_vars();
    parse_env = init_parser(predefined_fin_vars,
                            '.',
                            ',',
                            trans_numeric,
                            numeric_ops,
                            negate_numeric,
                            free_numeric);

    npp  = fininfo.npp;
    ir   = fininfo.ir;
    pv   = fininfo.pv;
    pmt  = fininfo.pmt;
    fv   = fininfo.fv;
    CF   = fininfo.CF;
    PF   = fininfo.PF;
    disc = fininfo.disc;
    bep  = fininfo.bep;

    fininfo.prec = prec;

    printf("Single Letter Commands:\na -- amortization schedule\nc -- compute financial variable\nd -- delete variable\ns -- output financial variable status\nq -- quit\nv -- list defined variables\n");
    for (;;)
{
        printf("<>");
        retcnt = strlen(fgets(buffer, 190, stdin));
        if ( (retcnt == 2) && (strchr(sl_commands, buffer[0]) != NULL) )
        {
            if ( buffer[0] == 'q' ) break;
            amortsched.prec = fininfo.prec;
            switch ( buffer[0] )
            {
            case 'a':
                if ( amortsched.Eff_Date_jdn && amortsched.Init_Date_jdn )
                {
                    printf("Current Effective  year: %u\nCurrent Effective month: %u\nCurrent Effective   day: %u\nCurrent Initial    year: %u\nCurrent Initial   month: %u\nCurrent Initial     day %u\n",
                           amortsched.year_E,
                           amortsched.month_E,
                           amortsched.day_E,
                           amortsched.year_I,
                           amortsched.month_I,
                           amortsched.day_I);
                    printf("Change dates ? (y/n) ");
                    fgets(buffer, 190, stdin);
                }
                else
                {
                    buffer[0] = 'y';
                } /* endif */
                if ( buffer[0] == 'y' )
                {
                    printf("Enter Effective Date - year: ");
                    fgets(buffer, 190, stdin);
                    if ( (errp = parse_string(&value, buffer, parse_env)) == NULL )
                    {
                        nval = (numeric_ptr)(value.value);
                        switch ( nval->type )
                        {
                        case INT_TYPE:
                            amortsched.year_E = nval->value.int_value;
                            break;
                        case DBL_TYPE:
                            amortsched.year_E = (unsigned)(nval->value.dbl_value);
                            break;
                        } /* endswitch */
                        if ( !value.variable_name ) free_numeric(value.value);
                    }
                    else
                    {
                        parse_error(get_parse_error(parse_env), buffer, errp);
                    } /* endif */
                    printf("Enter Effective Date - month: ");
                    fgets(buffer, 190, stdin);
                    if ( (errp = parse_string(&value, buffer, parse_env)) == NULL )
                    {
                        nval = (numeric_ptr)(value.value);
                        switch ( nval->type )
                        {
                        case INT_TYPE:
                            amortsched.month_E = nval->value.int_value;
                            break;
                        case DBL_TYPE:
                            amortsched.month_E = (unsigned)(nval->value.dbl_value);
                            break;
                        } /* endswitch */
                        if ( !value.variable_name ) free_numeric(value.value);
                    }
                    else
                    {
                        parse_error(get_parse_error(parse_env), buffer, errp);
                    } /* endif */
                    printf("Enter Effective Date - day: ");
                    fgets(buffer, 190, stdin);
                    if ( (errp = parse_string(&value, buffer, parse_env)) == NULL )
                    {
                        nval = (numeric_ptr)(value.value);
                        switch ( nval->type )
                        {
                        case INT_TYPE:
                            amortsched.day_E = nval->value.int_value;
                            break;
                        case DBL_TYPE:
                            amortsched.day_E = (unsigned)(nval->value.dbl_value);
                            break;
                        } /* endswitch */
                        if ( !value.variable_name ) free_numeric(value.value);
                    }
                    else
                    {
                        parse_error(get_parse_error(parse_env), buffer, errp);
                    } /* endif */
                    printf("Enter Initial Payment Date - year: ");
                    fgets(buffer, 190, stdin);
                    if ( (errp = parse_string(&value, buffer, parse_env)) == NULL )
                    {
                        nval = (numeric_ptr)(value.value);
                        switch ( nval->type )
                        {
                        case INT_TYPE:
                            amortsched.year_I = nval->value.int_value;
                            break;
                        case DBL_TYPE:
                            amortsched.year_I = (unsigned)(nval->value.dbl_value);
                            break;
                        } /* endswitch */
                        if ( !value.variable_name ) free_numeric(value.value);
                    }
                    else
                    {
                        parse_error(get_parse_error(parse_env), buffer, errp);
                    } /* endif */
                    printf("Enter Initial Payment Date - month: ");
                    fgets(buffer, 190, stdin);
                    if ( (errp = parse_string(&value, buffer, parse_env)) == NULL )
                    {
                        nval = (numeric_ptr)(value.value);
                        switch ( nval->type )
                        {
                        case INT_TYPE:
                            amortsched.month_I = nval->value.int_value;
                            break;
                        case DBL_TYPE:
                            amortsched.month_I = (unsigned)(nval->value.dbl_value);
                            break;
                        } /* endswitch */
                        if ( !value.variable_name ) free_numeric(value.value);
                    }
                    else
                    {
                        parse_error(get_parse_error(parse_env), buffer, errp);
                    } /* endif */
                    printf("Enter Initial Payment Date - day: ");
                    fgets(buffer, 190, stdin);
                    if ( (errp = parse_string(&value, buffer, parse_env)) == NULL )
                    {
                        nval = (numeric_ptr)(value.value);
                        switch ( nval->type )
                        {
                        case INT_TYPE:
                            amortsched.day_I = nval->value.int_value;
                            break;
                        case DBL_TYPE:
                            amortsched.day_I = (unsigned)(nval->value.dbl_value);
                            break;
                        } /* endswitch */
                        if ( !value.variable_name ) free_numeric(value.value);
                    }
                    else
                    {
                        parse_error(get_parse_error(parse_env), buffer, errp);
                    } /* endif */
                } /* endif */

                amortsched.n     = npp;
                amortsched.nint  = ir;
                amortsched.pv    = pv;
                amortsched.pmt   = pmt;
                amortsched.fv    = fv;
                amortsched.CF    = CF;
                amortsched.PF    = PF;
                amortsched.disc  = disc;
                amortsched.bep   = bep;

                Amortization_init(&amortsched);
                amort_opt(&amortsched, parse_env);

                (void)Amortization_Schedule(&amortsched);
                prt_amortization_schedule(&amortsched, stdout);
                Amortization_free(&amortsched);
                break;
            case 'c':

                printf("Compute:\nn   - 1\ni   - 2\npv  - 3\npmt - 4\nfv  - 5\n1, 2, 3, 4 or 5: ");
                retcnt = strlen(fgets(buffer, 190, stdin));
                compute = buffer[0] - '0';

                switch ( compute-- )
                {
                case 0: /* all values specified nothing to compute */
                    break;
                case 1: /* compute number of periods, npp */
                    printf("Computing numbor of periods\n");
                    npp = fi_calc_num_payments(&fininfo);
                    printf("Number of Periods: %u\n", npp);
                    nval = (numeric_ptr)(predefined_fin_vars[compute].value);
                    nval->value.int_value = npp;
                    break;
                case 2: /* compute interest, ir */
                    printf("Computing interest rate\n");
                    ir = fi_calc_interest(&fininfo);
                    printf("Nominal Interest Rate: %.*f\n", prec, ir);
                    nval = (numeric_ptr)(predefined_fin_vars[compute].value);
                    nval->value.dbl_value = ir;
                    break;
                case 3: /* compute present value, pv */
                    printf("Computing Present Value\n");
                    pv = fi_calc_present_value(&fininfo);
                    printf("Present Value: %.*f\n", prec, pv);
                    nval = (numeric_ptr)(predefined_fin_vars[compute].value);
                    nval->value.dbl_value = pv;
                    break;
                case 4: /* compute periodic payment, pmt */
                    printf("Computing periodic payment\n");
                    pmt = fi_calc_payment(&fininfo);
                    printf("Periodic Payment: %.*f\n", prec, pmt);
                    nval = (numeric_ptr)(predefined_fin_vars[compute].value);
                    nval->value.dbl_value = pmt;
                    break;
                case 5: /* compute future value, fv */
                    printf("Computing Future Value\n");
                    fv = fi_calc_future_value(&fininfo);
                    printf("Future Value: %.*f\n", prec, fv);
                    nval = (numeric_ptr)(predefined_fin_vars[compute].value);
                    nval->value.dbl_value = fv;
                    break;
                default:    /* whoops */
                    break;
                } /* endswitch */
                break;
            case 'd':
                printf("Enter name of variable to delete: ");
                retcnt = strlen(fgets(buffer, 190, stdin));
                buffer[retcnt - 1] = EOS;
                if ( !delete_var(buffer, parse_env) )
                {
                    printf("Unable to delete specified variable\n");
                } /* endif */
                break;
            case 's':
                prt_status(&fininfo,
                           stdout);
                break;
            case 'v':
                for ( value_list = parser_get_vars(parse_env) ; value_list ; value_list = value_list->next_var )
                {
                    printf("%s: ", value_list->variable_name);
                    nval = (numeric_ptr)(value_list->value);
                    switch ( nval->type )
                    {
                    case INT_TYPE:
                        printf("%i\n", nval->value.int_value);
                        break;
                    case DBL_TYPE:
                        printf("%.*f\n", prec, nval->value.dbl_value);
                        break;
                    } /* endswitch */
                } /* endfor */
                break;
            } /* endswitch */
        }
        else if ( retcnt > 1 )
        {
            buffer[retcnt - 1] = EOS;

            if ( (errp = parse_string(&value, buffer, parse_env)) == NULL )
            {
                if ( value.variable_name ) printf("Variable: %s\n", value.variable_name);
                nval = (numeric_ptr)(value.value);
                switch ( nval->type )
                {
                case INT_TYPE:
                    printf("Evaluated Value: %i\n", nval->value.int_value);
                    break;
                case DBL_TYPE:
                    printf("Evaluated Value: %.*f\n", prec, nval->value.dbl_value);
                    break;
                } /* endswitch */
                if ( !value.variable_name ) free_numeric(value.value);
                chk_vars(predefined_fin_vars, fin_vars, fin_type, PREDEFINED_FIN_VARS);
                fininfo.npp = npp;
                fininfo.ir = ir;
                fininfo.pv = pv;
                fininfo.pmt = pmt;
                fininfo.fv = fv;
                fininfo.CF = CF;
                fininfo.PF = PF;
                fininfo.disc = disc;
                fininfo.bep = bep;
            }
            else
            {
                parse_error(get_parse_error(parse_env), buffer, errp);
            } /* endif */
        } /* endif */
    } /* endfor */
    exit_parser(parse_env);
    unset_fin_vars();
} /* main */