static void testcase2(const char *desc) { char buffer[3]; const char *str = " \tdisplay-multi:(display-x:-noshm):(display-aa)"; const char *retstr; const char *expected = "d"; printteststart(__FILE__, __PRETTY_FUNCTION__, EXPECTED2PASS, desc); if (dontrun) return; /* Testcase: Passing a string with an too short * target buffer expects to fill out the buffer * as much as possible, but not complete. */ retstr = ggParseTarget(str, buffer, sizeof(buffer)); if (retstr != NULL) { printfailure("expected return value: \"%s\"\n" "actual return value: \"%s\"\n", "NULL", (retstr) ? retstr : "NULL"); return; } if (strncmp(expected, buffer, 3) != 0) { printfailure("expected target value: \"%s\"\n" "actual target value: \"%s\"\n", expected, buffer); return; } printsuccess(); return; }
static void testcase3(const char *desc) { char buffer[1024]; const char *str = " \tdisplay-multi:(display-x:-noshm):(display-aa)"; const char *retstr; const char *expected = "display-x:-noshm"; printteststart(__FILE__, __PRETTY_FUNCTION__, EXPECTED2PASS, desc); if (dontrun) return; /* Testcase: Passing a string with valid arguments * expects to return ":" */ retstr = ggParseTarget(&str[16], buffer, sizeof(buffer)); if (retstr == NULL || strncmp(":", retstr, 1) != 0) { printfailure("expected return value: \"%s\"\n" "actual return value: \"%s\"\n", ":", (retstr) ? retstr : "NULL"); return; } if (strncmp(expected, buffer, 1024) != 0) { printfailure("expected target value: \"%s\"\n" "actual target value: \"%s\"\n", expected, buffer); return; } printsuccess(); return; }
static void testcase1(const char *desc) { char buffer[1024]; const char *str = " \t"; const char *retstr; const char *expected = ""; printteststart(__FILE__, __PRETTY_FUNCTION__, EXPECTED2PASS, desc); if (dontrun) return; /* Testcase: Passing a string with whitespaces only * expects to return \0 */ retstr = ggParseTarget(str, buffer, sizeof(buffer)); if (strncmp(expected, retstr, 1) != 0) { printfailure("expected return value: \"%s\"\n" "actual return value: \"%s\"\n", expected, retstr); return; } printsuccess(); return; }
static int GGIopen_monotext(struct ggi_visual *vis, struct ggi_dlhandle *dlh, const char *args, void *argptr, uint32_t *dlret) { ggi_palemu_priv *priv; gg_option options[MONOTEXT_NUM_OPTS]; char target[1024]; struct gg_api *api; struct gg_observer *obs = NULL; int val; int err = 0; DPRINT("display-monotext: GGIopen start.\n"); memcpy(options, monotext_optlist, sizeof(options)); if (args) { args = ggParseOptions(args, options, MONOTEXT_NUM_OPTS); if (args == NULL) { fprintf(stderr, "display-monotext: error in arguments\n"); return GGI_EARGINVAL; } } /* open the parent visual */ DPRINT("display-monotext: opening target: %s\n", args); if (args != NULL) { if (ggParseTarget(args, target, sizeof(target)) == NULL) { /* error occured */ return GGI_EARGINVAL; } } /* Find out the parent target */ while (args && *args && isspace((uint8_t)*args)) { args++; } *target = '\0'; if (args) { if (ggParseTarget(args, target, sizeof(target)) == NULL) { return GGI_EARGINVAL; } } if (*target == '\0') { strcpy(target, "auto"); } LIBGGI_GC(vis) = malloc(sizeof(ggi_gc)); if (LIBGGI_GC(vis) == NULL) { err = GGI_ENOMEM; goto err0; } LIBGGI_PRIVATE(vis) = priv = malloc(sizeof(ggi_palemu_priv)); if (priv == NULL) { err = GGI_ENOMEM; goto err1; } priv->flush_lock = ggLockCreate(); if (priv->flush_lock == NULL) { err = GGI_ENOMEM; goto err2; } priv->opmansync = malloc(sizeof(_ggi_opmansync)); if (priv->opmansync == NULL) { err = GGI_ENOMEM; goto err3; } priv->flags = 0; priv->fb_ptr = NULL; priv->target = MONOTEXT_TARGET; DPRINT("display-monotext: opening target: %s\n", target); priv->parent = ggNewStem(NULL); if (priv->parent == NULL) { fprintf(stderr, "display-monotext: Failed to create stem for target: %s\n", target); err = GGI_ENODEVICE; goto err3; } /* XXX Should iterate over the apis attached to vis->instance.stem * instead of only looking for ggi and gii. */ if (ggiAttach(priv->parent) < 0) { ggDelStem(priv->parent); priv->parent = NULL; fprintf(stderr, "display-monotext: Failed to attach ggi to stem for target: %s\n", target); err = GGI_ENODEVICE; goto err4; } api = ggGetAPIByName("gii"); if (api != NULL) { /* XXX This should probably be done in pseudo-stubs-gii */ if (STEM_HAS_API(vis->instance.stem, api)) { if (ggAttach(api, priv->parent) < 0) { ggDelStem(priv->parent); priv->parent = NULL; fprintf(stderr, "Failed to attach gii to stem for target: %s\n", target); err = GGI_ENODEVICE; goto err4; } obs = ggObserve(GG_STEM_API_CHANNEL(priv->parent, api), transfer_gii_src, vis->instance.stem); } } if (ggiOpen(priv->parent, target, NULL) < 0) { if (obs) { ggDelObserver(obs); obs = NULL; } fprintf(stderr, "display-monotext: Failed to open target: '%s'\n", target); ggDelStem(priv->parent); priv->parent = NULL; err = GGI_ENODEVICE; goto err4; } if (obs) { ggDelObserver(obs); obs = NULL; } ggiSetFlags(priv->parent, GGIFLAG_ASYNC); /* set defaults */ priv->parent_defmode.graphtype = GT_TEXT16; priv->flags = 0; priv->squish.x = priv->squish.y = 1; val = strtol(options[OPT_A].result, NULL, 0); if (val != 0) { priv->accuracy.x = priv->accuracy.y = val; } else { priv->accuracy.x = strtol(options[OPT_X].result, NULL, 0); priv->accuracy.y = strtol(options[OPT_Y].result, NULL, 0); } /* Setup mansync */ MANSYNC_open(vis, priv); if (priv->mod_mansync == NULL) { fprintf(stderr, "display-monotext: Cannot load helper-mansync!\n"); GGIclose_monotext(vis, dlh); goto err4; } MANSYNC_init(vis); if (!(LIBGGI_FLAGS(vis) & GGIFLAG_ASYNC)) { MANSYNC_start(vis); } /* Has mode management */ vis->opdisplay->getmode = GGI_palemu_getmode; vis->opdisplay->setmode = GGI_palemu_setmode; vis->opdisplay->checkmode = GGI_monotext_checkmode; vis->opdisplay->getapi = GGI_palemu_getapi; vis->opdisplay->flush = GGI_palemu_flush; vis->opdisplay->setflags = GGI_palemu_setflags; DPRINT("display-monotext: GGIopen succeeded.\n"); *dlret = GGI_DL_OPDISPLAY; return 0; err4: free(priv->opmansync); err3: ggLockDestroy(priv->flush_lock); err2: free(priv); err1: free(LIBGGI_GC(vis)); err0: return err; }
static int GGIopen_palemu(struct ggi_visual *vis, struct ggi_dlhandle *dlh, const char *args, void *argptr, uint32_t *dlret) { ggi_palemu_priv *priv; gg_option options[PALEMU_NUM_OPTS]; char target[1024]; int err = GGI_ENOMEM; struct gg_api *api; struct gg_observer *obs = NULL; DPRINT("display-palemu: GGIopen start.\n"); /* handle arguments */ memcpy(options, palemu_optlist, sizeof(options)); if (args) { args = ggParseOptions(args, options, PALEMU_NUM_OPTS); if (args == NULL) { fprintf(stderr, "display-palemu: error in arguments.\n"); return GGI_EARGINVAL; } } if (getenv("GGI_PALEMU_OPTIONS") != NULL) { if (ggParseOptions(getenv("GGI_PALEMU_OPTIONS"), options, PALEMU_NUM_OPTS) == NULL) { fprintf(stderr, "display-palemu: error in ""$GGI_PALEMU_OPTIONS.\n"); return GGI_EARGINVAL; } } /* Find out the parent target. */ while (args && *args && isspace((uint8_t)*args)) { args++; } *target = '\0'; if (args) { if (ggParseTarget(args, target, 1024) == NULL) { return GGI_EARGINVAL; } } if (*target == '\0') { strcpy(target, "auto"); } LIBGGI_GC(vis) = malloc(sizeof(ggi_gc)); if (LIBGGI_GC(vis) == NULL) { return GGI_ENOMEM; } LIBGGI_PRIVATE(vis) = priv = malloc(sizeof(*priv)); if (priv == NULL) { goto out_freegc; } priv->flush_lock = ggLockCreate(); if (priv->flush_lock == NULL) { goto out_freepriv; } priv->opmansync = malloc(sizeof(_ggi_opmansync)); if (priv->opmansync == NULL) { goto out_freelock; } priv->flags = 0; priv->fb_ptr = NULL; priv->target = PALEMU_TARGET; DPRINT("display-palemu: parent mode is '%s'\n", options[OPT_PARENT].result); ggiParseMode(options[OPT_PARENT].result, &priv->parent_defmode); DPRINT("display-palemu: opening target: %s\n", target); priv->parent = ggNewStem(NULL); if (priv->parent == NULL) { fprintf(stderr, "display-palemu: Failed to create stem for target: '%s'\n", target); err = GGI_ENODEVICE; goto out_freeopmansync; } /* FIXME! Should iterate over the apis attached to vis->instance.stem * instead of only looking for ggi and gii. */ if (ggiAttach(priv->parent) < 0) { ggDelStem(priv->parent); priv->parent = NULL; fprintf(stderr, "display-palemu: Failed to attach ggi to stem for target: '%s'\n", target); err = GGI_ENODEVICE; goto out_freeopmansync; } if ((api = ggGetAPIByName("gii")) != NULL) { /* FIXME! This should probably be done in pseudo-stubs-gii */ if (STEM_HAS_API(vis->instance.stem, api)) { if (ggAttach(api, priv->parent) < 0) { ggDelStem(priv->parent); priv->parent = NULL; fprintf(stderr, "display-palemu: Failed to attach gii to stem for target: '%s'\n", target); err = GGI_ENODEVICE; goto out_freeopmansync; } obs = ggObserve(GG_STEM_API_CHANNEL(priv->parent, api), transfer_gii_src, vis->instance.stem); } } if (ggiOpen(priv->parent, target, NULL) < 0) { if (obs) { ggDelObserver(obs); obs = NULL; } fprintf(stderr, "display-palemu: Failed to open target: '%s'\n", target); ggDelStem(priv->parent); priv->parent = NULL; err = GGI_ENODEVICE; goto out_freeopmansync; } if (obs) { ggDelObserver(obs); obs = NULL; } ggiSetFlags(priv->parent, GGIFLAG_ASYNC); /* Setup mansync */ MANSYNC_open(vis, priv); if (priv->mod_mansync == NULL) { fprintf(stderr, "display-palemu: Cannot load helper-mansync!\n"); GGIclose_palemu(vis, dlh); return err; } MANSYNC_init(vis); if (!(LIBGGI_FLAGS(vis) & GGIFLAG_ASYNC)) { MANSYNC_start(vis); } /* Has mode management */ vis->opdisplay->getmode = GGI_palemu_getmode; vis->opdisplay->setmode = GGI_palemu_setmode; vis->opdisplay->checkmode = GGI_palemu_checkmode; vis->opdisplay->getapi = GGI_palemu_getapi; vis->opdisplay->flush = GGI_palemu_flush; vis->opdisplay->setflags = GGI_palemu_setflags; DPRINT("display-palemu: GGIopen succeeded.\n"); *dlret = GGI_DL_OPDISPLAY; return 0; out_freelock: ggLockDestroy(priv->flush_lock); out_freeopmansync: free(priv->opmansync); out_freepriv: free(priv); out_freegc: free(LIBGGI_GC(vis)); return err; }