int main(int argc, char* argv[])
{
    const int MAX = 30;
    int a[MAX];

    CREATE_ARRAY(a, MAX, 100);
    PRINT_ARRAY(a, MAX);
    printf("%d prime numbers in the array:\n", primeArray(a, MAX));
    for (int i = 0; i < MAX; ++i)
        if (a[i])
            printf("%3d", a[i]);
    puts("");
    if (argc > 1)
        printf("%d prime numbers in 2~%d.\n", prime2toN(atoi(argv[1])), atoi(argv[1]));

    return 0;
}
//---------------------------------------------------------------------------
void ShowError(JSContext *cx, const char *message, JSErrorReport *report) {
    int  where;
    char *cstr;

    void                   *CREPORT;
    INVOKE_CALL            Invoke      = InvokePtr;
    CALL_BACK_VARIABLE_SET SetVariable = _SetVariable;
    void                   *HANDLER    = CONCEPT_HANDLER;

    if (!ERR_DELEGATE) {
        printError(cx, message, report);
        return;
    }

    CREATE_VARIABLE(CREPORT);

    if (!CREATE_OBJECT(CREPORT, "JSErrorReport"))
        return;    // (void *)"Failed to INVOKE_CREATE_OBJECT";


    void *member = 0;

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "filename", member)))
        return;

    SET_STRING_VARIABLE(member, report->filename);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "lineno", member)))
        return;

    SET_NUMBER_VARIABLE(member, report->lineno);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "linebuf", member)))
        return;

    SET_STRING_VARIABLE(member, (char *)report->linebuf);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "tokenptr", member)))
        return;

    SET_STRING_VARIABLE(member, (char *)report->tokenptr);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "uclinebuf", member)))
        return;

    SET_STRING_VARIABLE(member, (char *)report->linebuf);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "uctokenptr", member)))
        return;

    SET_STRING_VARIABLE(member, (char *)report->tokenptr);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "flags", member)))
        return;

    SET_NUMBER_VARIABLE(member, report->flags);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "errorNumber", member)))
        return;

    SET_NUMBER_VARIABLE(member, report->errorNumber);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "ucmessage", member)))
        return;

    SET_STRING_VARIABLE(member, message);

    if (!IS_OK(GET_MEMBER_VAR(CREPORT, "messageArgs", member)))
        return;

    CREATE_ARRAY(member);

    /*int i=0;
       char **messageArg=report->messageArgs ? report->messageArgs[i] : 0;
       while (messageArg) {
       Invoke(INVOKE_SET_ARRAY_ELEMENT,member,(INTEGER)i,(INTEGER)VARIABLE_STRING,(char *)messageArg,(NUMBER)0);
       messageArg=report->messageArgs[++i];
       }*/
    // call delegate
    CALL_DELEGATE(ERR_DELEGATE, (INTEGER)3, (INTEGER)VARIABLE_NUMBER, (char *)"", (NUMBER)(SYS_INT)cx, (INTEGER)VARIABLE_STRING, (char *)message, (NUMBER)0, (INTEGER)VARIABLE_UNDEFINED, CREPORT);
    FREE_VARIABLE(CREPORT);
}