Exemplo n.º 1
0
int main(int argc, char **argv)
{
    Params params;
    params.m = 1;
    params.r = 2;
    params.Pr = 60;
    params.Pi = 60;
    params.peps = 0.2;
    params.t = 0.0;
    params.smear = 0;
    params.sigma = 0.0;

    const char* opt_prefix = "";
    int opt_select = OPT_SELECT_INTEGRAL;
    int opt_contour = OPT_CONTOUR_M;
    gsl_complex opt_z0 = { { 0.0 } };
    gsl_complex opt_z1 = { { 0.0 } };
    int opt_n = 10000;

    const char* const short_options = "";

    const struct option long_options[] = {
      { "help",         0, NULL, 'h' },
      { "envelope",     0, &opt_select, OPT_SELECT_ENVELOPE },
      { "integrand",    0, &opt_select, OPT_SELECT_INTEGRAND },
      { "bessel",       0, &opt_select, OPT_SELECT_BESSEL },
      { "contour-II",   0, &opt_contour, OPT_CONTOUR_II },
      { "contour-IUI",  0, &opt_contour, OPT_CONTOUR_IUI },
      { "d",            1, NULL, 'd' },
      { "n",            1, NULL, 'n' },
      { "m",            1, NULL, 'm' },
      { "prefix",       1, NULL, 'p' },
      { "r",            1, NULL, 'r' },
      { "t",            1, NULL, 't' },
      { "z0",           1, NULL, '0' },
      { "z1",           1, NULL, '1' },
      { "Pr",           1, NULL, 'P' },
      { "Pi",           1, NULL, 'I' },
      { "smear",        1, NULL, 's' },
      { NULL,           0, NULL, 0   } /* end */
    };

    int next_option;
    do {
        next_option = getopt_long(argc, argv, short_options,
                long_options, NULL);
        switch (next_option)
        {
            case 'h':
                print_usage(stdout, 0);

            case 'd':
                parse_double(optarg, &params.d);
                break;

            case 'm':
                parse_double(optarg, &params.m);
                break;

            case 'n':
                opt_n = atoi(optarg);
                if (opt_n < 1)
                    opt_n = 1;
                break;

            case 'p':
                opt_prefix = optarg;
                break;

            case 'r':
                parse_double(optarg, &params.r);
                break;

            case 's':
                parse_double(optarg, &params.sigma);
                params.smear = 1;
                break;

            case 't':
                parse_double(optarg, &params.t);
                break;

            case '?':
                // invalid option
                print_usage(stderr, 1);

            case '0':
                parse_complex(optarg, &opt_z0);
                break;

            case '1':
                parse_complex(optarg, &opt_z1);
                break;

            case 'P':
                parse_double(optarg, &params.Pr);
                break;

            case 'I':
                parse_double(optarg, &params.Pi);
                break;

            case 0:  break; // flag handled
            case -1: break; // end of options

            default:
                abort();
        }
    }
    while (next_option != -1);

    PlotContext ctx;
    memset(&ctx, 0, sizeof(ctx));
    ctx.filename_contour = alloc_sprintf("%sCONTOUR.dat", opt_prefix);
    ctx.filename_data = alloc_sprintf("%sFUNCTION.dat", opt_prefix);

    if (opt_select != OPT_SELECT_INTEGRAL)
    {
        FILE *os = fopen(ctx.filename_data, "w");
        ComplexFunction func;
        switch (opt_select)
        {
            case OPT_SELECT_ENVELOPE : func = (ComplexFunction) &f_envelope; break;
            case OPT_SELECT_INTEGRAND: func = (ComplexFunction) &f_integrand; break;
            case OPT_SELECT_BESSEL   : func = (ComplexFunction) &f_bessel; break;
            default: abort();
        }
        tabulate(os, func, &params, opt_z0, opt_z1, opt_n);
        fclose(os);

        Contour contour;
        define_contour_line_segment(opt_z0, opt_z1, &contour);

        os = fopen(ctx.filename_contour, "w");
        emit_contour_points(&params, &contour, os);
        fclose(os);
    }
    else
    {
        Contour contour;
        switch (opt_contour)
        {
            case OPT_CONTOUR_II:
                define_contour_II(&params, params.d, &contour);
                break;
            case OPT_CONTOUR_IUI:
                define_contour_M(&params, params.d, 1, &contour);
                break;
            case OPT_CONTOUR_M:
                define_contour_M(&params, params.d, 0, &contour);
                break;
            default: abort();
        }

        FILE *os = fopen(ctx.filename_data, "w");
        tabulate_integral(
            &params,
            &contour,
            GSL_REAL(opt_z0), GSL_REAL(opt_z1),
            opt_n, os);
        fclose(os);

        os = fopen(ctx.filename_contour, "w");
        emit_contour_points(&params, &contour, os);
        fclose(os);
    }

    return 0;
}
Exemplo n.º 2
0
void showSubreddit(const char *subreddit)
{
    char *line;
    LinkScreen *screen;
    RedditListType listType = REDDIT_HOT; // Default RedditListType for screen is 'hot'

    DEBUG_PRINT(L"Loading Subreddit %s\n", subreddit);
    screen = linkScreenNew();

    linkScreenSetup(screen, subreddit, listType);

    drawScreen(screen); //And print the screen!

    int c;
    while((c = wgetch(stdscr))) {
        switch(c) {
            case 'k': case KEY_UP:
                linkScreenUp(screen);
                drawScreen(screen);
                break;

            case 'j': case KEY_DOWN:
                linkScreenDown(screen);
                drawScreen(screen);
                break;
            case 'K':
                linkScreenTextScrollUp(screen);
                drawScreen(screen);
                break;
            case 'J':
                linkScreenTextScrollDown(screen);
                drawScreen(screen);
                break;
            case 'q':
                if (screen->linkOpen) {
                    linkScreenCloseLink(screen);
                    drawScreen(screen);
                } else {
                    goto cleanup;
                }
                break;
            case 'u':
                redditLinkListFreeLinks(screen->list);
                redditGetListing(screen->list);
                screen->offset = 0;
                screen->selected = 0;
                drawScreen(screen);
                break;
            case 'l': case '\n': case KEY_ENTER:
                if (screen->helpOpen)
                    linkScreenCloseHelp(screen);
                else
                    linkScreenToggleLink(screen);
                drawScreen(screen);
                break;
            case 'o':
                line = alloc_sprintf("xdg-open %s", screen->list->links[screen->selected]->url);
                system(line);
                free(line);

                redditLinkListFree(screen->list);
                linkScreenFree(screen);

                screen = linkScreenNew();
                linkScreenSetup(screen, subreddit, listType);

                drawScreen(screen);
                break;
            case 'L':
                redditGetListing(screen->list);
                drawScreen(screen);
                break;
            case 'c':
                showThread(screen->list->links[screen->selected]);
                drawScreen(screen);
                break;
            case '?':
                linkScreenToggleHelp(screen);
                if (screen->helpOpen)
                    linkScreenOpenLink(screen);
                drawScreen(screen);
                break;
            case '1':
                if (screen->list->type != REDDIT_HOT)
                {
                    listType = REDDIT_HOT;
                    redditLinkListFree(screen->list);
                    linkScreenFree(screen);

                    screen = linkScreenNew();
                    linkScreenSetup(screen, subreddit, listType);

                    drawScreen(screen);
                }
                break;
            case '2':
                if (screen->list->type != REDDIT_NEW)
                {
                    listType = REDDIT_NEW;
                    redditLinkListFree(screen->list);
                    linkScreenFree(screen);

                    screen = linkScreenNew();
                    linkScreenSetup(screen, subreddit, listType);

                    drawScreen(screen);
                }
                break;
            case '3':
                if (screen->list->type != REDDIT_RISING)
                {
                    listType = REDDIT_RISING;
                    redditLinkListFree(screen->list);
                    linkScreenFree(screen);

                    screen = linkScreenNew();
                    linkScreenSetup(screen, subreddit, listType);

                    drawScreen(screen);
                }
                break;
            case '4':
                if (screen->list->type != REDDIT_CONTR)
                {
                    listType = REDDIT_CONTR;
                    redditLinkListFree(screen->list);
                    linkScreenFree(screen);

                    screen = linkScreenNew();
                    linkScreenSetup(screen, subreddit, listType);

                    drawScreen(screen);
                }
                break;
            case '5':
                if (screen->list->type != REDDIT_TOP)
                {
                    listType = REDDIT_TOP;
                    redditLinkListFree(screen->list);
                    linkScreenFree(screen);

                    screen = linkScreenNew();
                    linkScreenSetup(screen, subreddit, listType);

                    drawScreen(screen);
                }
                break;
        }
    }

cleanup:;
    redditLinkListFree(screen->list);
    linkScreenFree(screen);
}
Exemplo n.º 3
0
/*************************************************************************
oexpr_title:
   In: root of an expression tree
   Out: text string that describes what is in that tree, or NULL if
        there is a memory error.
   Note: the value is recursively generated, but title member variables
         of the expression are not set.  The function keeps track of
         them on the fly.
*************************************************************************/
char *oexpr_title(struct output_expression *root) {
  struct output_request *orq;
  char *lstr, *rstr, *str;

  lstr = rstr = NULL;

  if (root->expr_flags & OEXPR_TYPE_CONST) {
    if ((root->expr_flags & OEXPR_TYPE_MASK) == OEXPR_LEFT_INT)
      return alloc_sprintf("%d", (int)root->value);
    else if ((root->expr_flags & OEXPR_TYPE_MASK) == OEXPR_TYPE_DBL)
      return alloc_sprintf("%.8g", root->value);
    else
      return NULL;
  }

  if (root->left != NULL) {
    if ((root->expr_flags & OEXPR_LEFT_MASK) == OEXPR_LEFT_INT)
      lstr = alloc_sprintf("%d", *((int *)root->left));
    else if ((root->expr_flags & OEXPR_LEFT_MASK) == OEXPR_LEFT_DBL)
      lstr = alloc_sprintf("%.8g", *((double *)root->left));
    else if ((root->expr_flags & OEXPR_LEFT_MASK) == OEXPR_LEFT_OEXPR)
      lstr = oexpr_title((struct output_expression *)root->left);
  }
  if (root->right != NULL) {
    if ((root->expr_flags & OEXPR_RIGHT_MASK) == OEXPR_RIGHT_INT)
      rstr = alloc_sprintf("%d", *((int *)root->right));
    else if ((root->expr_flags & OEXPR_RIGHT_MASK) == OEXPR_RIGHT_DBL)
      rstr = alloc_sprintf("%.8g", *((double *)root->right));
    else if ((root->expr_flags & OEXPR_RIGHT_MASK) == OEXPR_RIGHT_OEXPR)
      rstr = oexpr_title((struct output_expression *)root->right);
  }

  switch (root->oper) {
  case '=':
    free(rstr);
    return lstr;

  case '@':
    free(lstr);
    free(rstr);
    return CHECKED_STRDUP("(complex)", NULL);

  case '#':
    if ((root->expr_flags & OEXPR_LEFT_MASK) != OEXPR_LEFT_REQUEST ||
        root->left == NULL) {
      free(lstr);
      free(rstr);
      return NULL;
    }
    orq = (struct output_request *)root->left;
    free(lstr);
    free(rstr);
    return strdup(orq->count_target->name);

  case '_':
    if (lstr == NULL) {
      free(rstr);
      return NULL;
    }
    str = alloc_sprintf("-%s", lstr);
    free(lstr);
    free(rstr);
    return str;

  case '(':
    if (lstr == NULL) {
      free(rstr);
      return NULL;
    }
    str = alloc_sprintf("(%s)", lstr);
    free(lstr);
    free(rstr);
    return str;

  case '+':
  case '-':
  case '*':
  case '/':
    if (lstr == NULL || rstr == NULL) {
      free(lstr);
      free(rstr);
      return NULL;
    }
    str = alloc_sprintf("%s%c%s", lstr, root->oper, rstr);
    free(lstr);
    free(rstr);
    return str;

  default:
    free(lstr);
    free(rstr);
    return NULL;
  }
  return NULL;
}