int main(int argc, char** argv) { struct timespec t1, t2; int j; clock_gettime(CLOCK_REALTIME, &t1); j = getpid(); clock_gettime(CLOCK_REALTIME, &t2); printf("Nanosec time sys call: %ld\n", t2.tv_nsec - t1.tv_nsec); clock_gettime(CLOCK_REALTIME, &t1); j = procCall(); clock_gettime(CLOCK_REALTIME, &t2); printf("Nanosec time proc call: %ld\n", t2.tv_nsec - t1.tv_nsec); return 0; }
Object* Parser::parseSubExpression1a(Object* pExpr) { std::auto_ptr<Object> expr(pExpr); if(hasTokens() && peekToken().getType() == T_LBRACKET) { Token tok = getToken(); std::auto_ptr<Object> num1; if(hasTokens() && peekToken().getType() != T_COLON) num1.reset(parseExpression()); if(hasTokens() && peekToken().getType() == T_RBRACKET) { getToken(); std::auto_ptr<Select> result(new Select(expr.release(), num1.release())); result->setLineNumber(tok.getLineNumber()); result->setColumnNumber(tok.getColumnNumber()); return parseSubExpression1a(result.release()); } if(!hasTokens() || peekToken().getType() != T_COLON) throw ParserSyntaxException(getToken(), "Expected ':' or ']'!"); getToken(); std::auto_ptr<Object> num2; if(hasTokens() && peekToken().getType() != T_RBRACKET) num2.reset(parseExpression()); if(!hasTokens() || peekToken().getType() != T_RBRACKET) throw ParserSyntaxException(getToken(), "Expected ']'!"); getToken(); std::auto_ptr<Slice> result(new Slice(expr.release(), num1.release(), num2.release())); result->setLineNumber(tok.getLineNumber()); result->setColumnNumber(tok.getColumnNumber()); return parseSubExpression1a(result.release()); } else if(hasTokens() && peekToken().getType() == T_LPAREN) { // Remove the left parentheses Token tok = getToken(); // Create a new call std::auto_ptr<Call> procCall(new Call()); procCall->setLineNumber(expr->getLineNumber()); procCall->setColumnNumber(expr->getColumnNumber()); // Set the identifier of the call procCall->setIdentifier(expr.release()); // Loop through the list of arguments and add them to a NodeList while(hasTokens() && peekToken().getType() != T_RPAREN) { // Look for an in-out symbol bool isInOut = false; if(hasTokens() && peekToken().getType() == T_LESSEQ) { getToken(); isInOut = true; } else if(hasTokens() && peekToken().getType() == T_EQGREAT) getToken(); // Create a new object for the argument std::auto_ptr<Object> currentArg(parseExpression()); // Store the parameter depending upon if it is in-out or not procCall->pushArgument(currentArg.release(), isInOut); if(!hasTokens() || peekToken().getType() != T_COMMA) break; getToken(); } // Look for the right parentheses if(!hasTokens() || peekToken().getType() != T_RPAREN) throw ParserSyntaxException(getToken(), "Expected ')'!"); getToken(); return parseSubExpression1a(procCall.release()); } return expr.release(); }