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; }
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); }
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); }
void SIMCAR_shrink_stack(SIMCAR_Interpreter *inter, int shrink_size) { shrink_stack(inter, shrink_size); }