예제 #1
0
파일: parser.c 프로젝트: ingver/cformat
static int handle_token_rbrace( Token * tk, Parser * parser, FILE * out )
{
	if( !tk || !parser || !out )
		return 0;

	int lbi = parser->brace_indent[parser->last_brace_indent];

	if( !parser->empty_line ) {
		putc( '\n', out );
		parser->empty_line = 1;
	}
	
	parser->indent = lbi;

	if( !push_indent( parser->indent, out ) )
	{
		return 0;
	}

	if( !push_token( tk, out ) )
	{
		return 0;
	}

	--parser->last_brace_indent;

	if( parser->last_brace_indent > 0
	    && parser->last_brace_indent < parser->stack_size - 10
	    && !shrink_stack( &(parser->brace_indent),
	                       &(parser->stack_size) ) )
	{
		return 0;
	}

	lbi = parser->brace_indent[parser->last_brace_indent];

	if( !parser->last_brace_indent )
	{
		parser->indent = lbi;
	}
	else
	{
		parser->indent = lbi + 1;
	}

	parser->empty_line = 0;
	parser->un_op = 0;
	return 1;
}
예제 #2
0
파일: eval.c 프로젝트: lyyyuna/sim_car
static void
call_native_function(SIMCAR_Interpreter *inter, SIMCAR_LocalEnvironment *env,
                     SIMCAR_LocalEnvironment *caller_env,
                     Expression *expr, SIMCAR_NativeFunctionProc *proc)
{
    SIMCAR_Value   value;
    int         arg_count;
    ArgumentList        *arg_p;
    SIMCAR_Value   *args;

    for (arg_count = 0, arg_p = expr->u.function_call_expression.argument;
         arg_p; arg_p = arg_p->next) {
        eval_expression(inter, caller_env, arg_p->expression);
        arg_count++;
    }
    args = &inter->stack.stack[inter->stack.stack_pointer-arg_count];
    value = proc(inter, env, arg_count, args);
    shrink_stack(inter, arg_count);

    push_value(inter, &value);
}
예제 #3
0
int main (int argc, char *argv[])
{
    int sd, ci, backlog = MAX_BACKLOG;
    short port = PORTNUM;

    if (argc > 1)
        ncons = atoi (argv[1]);

    /* decrease stack size, non-privilged operation */
    /*    shrink_stack (STACK_SIZE); not needed for parent */

    /* increase maximum number of file descriptors, must be root! */
    /* a few extra, for 0, 1, 2 etc. */
    check_and_set_max_fd (ncons + 8);

    cd = malloc (ncons * sizeof (int));
    isopen = malloc (ncons * sizeof (int));
    pid = malloc (ncons * sizeof (pid_t));
    gethostname (hostname, 128);

    signal (SIGCHLD, cleanupkids);

    /* open an internet tcp stream socket */
    /* socket, setsockopt for reuse, bind, listen; */

    sd = get_socket (port, backlog);

    for (ci = 0; ci < ncons; ci++)
        isopen[ci] = 0;

    for (;;) {

        /* accept new connection only if less than
           the maximum is there */
        while (nopen == ncons) {
            /* reap any children; there may be a
               race condition or signal pileup! */
            cleanupkids (SIGCHLD);
        }

        /*  find the first open one */

        ci = accept_one (sd, isopen, cd, ncons);
        isopen[ci] = 1;
        nopen++;
        printf ("connection accepted (cd[%2d] = %2d), nopen = %2d\n",
                ci, cd[ci], nopen);
        fflush (stdout);

        /* fork off a child to handle the connection */

        pid[ci] = fork ();
        if (pid[ci] < 0)
            DEATH ("Forking");

        if (pid[ci] == 0) {     /* child */

            /* decrease stack size, non-privilged operation */
            shrink_stack (STACK_SIZE);
            /* can set back for kids */
            set_max_fd (16);

            while (!handle_client (cd[ci])) ;
            terminate_client (ci);
        } else {                /* parent */
            printf (" I forked for ci=%d, pid=%d\n", ci, pid[ci]);
            fflush (stdout);
        }
    }

    close (sd);
    free (isopen);
    free (cd);
    exit (EXIT_SUCCESS);
}
예제 #4
0
파일: eval.c 프로젝트: lyyyuna/sim_car
void
SIMCAR_shrink_stack(SIMCAR_Interpreter *inter, int shrink_size)
{
    shrink_stack(inter, shrink_size);
}