/* * The Npic library and tools * * Copyright (C) 2003 Edouard Thiel * * This program is free software under the terms of the * GNU Lesser General Public License (LGPL) version 2.1. */ /* DO NOT EDIT !!! Generated by npic-templa from "npic-xfig.ct" */ /* * npic-xfig.c - 22/10/2008 * */ #include void ShowUsage () { printf ( "npic-xfig - Convert an 2-d image file to an Xfig file.\n" "Usage:\n" " npic-xfig -h | -help | --help : print help\n" " npic-xfig in1 out1 [options] : convert in1 to out1\n" "\n" "Options:\n" " -box y x h w : only convert this part of image\n" " -latex : add text flag 'special' to produce pstex\n" " -font n : change font size (default is 12)\n" " -size h w : change pixel height and width in cm (default is 0.8 0.8)\n" " -nozero : do not output 0 values\n" " -norect : do not output 0 pixels\n" " -bg a b grey : set bg color for [a..b] pixels to grey (0..100)\n" " (multiple -bg ... are allowed.)\n" " -coords : show coordinates\n" " -co-orig y x : the coordinates start from y,x\n" " -co-font n : change coordinates font size (default is 10)\n" " -3d : add 3D effects (more with -norect)\n" " -3d-size h w : change 3D border height and width in cm (default 0.15 0.18)\n" " -show : show result with xfig\n" "\n" "in1 : image in " NPIC_KNOWN_IMAGE_EXT " format\n" "out1 : result in the Xfig .fig format\n" "\n" "Example:\n" " ./npic-sedt -dt -saito ../images/ex1_2c.npz tmp1.npz\n" " ./npic-xfig tmp1.npz tmp2.fig -norect -nozero -coords -3d \\\n" " -bg 9 15 90 -bg 16 25 80 -show\n" "\n" ); } #define FIGR 15 #define BGNB 32000 typedef struct { FILE *f; int mode_latex, font_size, font_height, zoom_w, zoom_h, nozero, norect, coords_show, coords_origx, coords_origy, coords_font, coords_height, e3d_show, e3d_iw, e3d_ih, show_result; double rect_size_w, rect_size_h, magnification, e3d_size_h, e3d_size_w; int bg_nb, bg_a[BGNB], bg_b[BGNB], bg_g[BGNB]; int box_x, box_y, box_w, box_h, depth_num, depth_rect, color_num, color_rect; } Fig_info; void InitFig (Fig_info *fgi) { fgi->f = NULL; fgi->mode_latex = 0; fgi->font_size = 12; fgi->font_height = fgi->font_size*FIGR; fgi->rect_size_w = 0.8; fgi->rect_size_h = 0.8; fgi->zoom_w = fgi->rect_size_w*450/FIGR; /* 1cm = 450u */ fgi->zoom_h = fgi->rect_size_h*450/FIGR; fgi->magnification = 75.0; fgi->nozero = 0; fgi->norect = 0; fgi->coords_show = 0; fgi->coords_origx = 0; fgi->coords_origy = 0; fgi->coords_font = 10; fgi->coords_height = fgi->coords_font*FIGR; fgi->e3d_show = 0; fgi->e3d_size_w = 0.18; fgi->e3d_size_h = 0.15; fgi->e3d_iw = fgi->e3d_size_w*450/FIGR; fgi->e3d_ih = fgi->e3d_size_h*450/FIGR; fgi->bg_nb = 0; fgi->box_x = -1; fgi->box_y = -1; fgi->box_w = -1; fgi->box_h = -1; fgi->depth_num = 10; fgi->depth_rect = 12; fgi->color_num = 32; fgi->color_rect = 33; fgi->show_result = 0; } void HeaderFig (Fig_info *fgi) { fprintf (fgi->f, "#FIG 3.2\n"); /* version */ fprintf (fgi->f, "Portrait\n"); /* orientation */ fprintf (fgi->f, "Center\n"); /* justification */ fprintf (fgi->f, "Metric\n"); /* units */ fprintf (fgi->f, "A4\n"); /* papersize */ fprintf (fgi->f, "%.2f\n", fgi->magnification); fprintf (fgi->f, "Single\n"); /* multiple-page */ fprintf (fgi->f, "0\n"); /* transparent color */ fprintf (fgi->f, "1200 2\n"); /* fig_resol., coord_system */ /* Colors */ fprintf (fgi->f, "0 %d #%02x%02x%02x\n", fgi->color_num, 0, 0, 0); fprintf (fgi->f, "0 %d #%02x%02x%02x\n", fgi->color_rect, 180, 180, 180); } void DrawString (Fig_info *fgi, int x, int y, char *line, int color, int depth, int font_size, int font_height) { if (line[0] == 0) return; fprintf (fgi->f, "4 %d %d %d 0 0 %d 0.0000 %d ", 1 /* centred H */, color, depth, font_size, fgi->mode_latex ? 3 : 1); fprintf (fgi->f, "%d %d %d %d ", font_height, (int) strlen(line)*font_height*2/3, x*FIGR, y*FIGR + font_height/3); /* centred V */ /* Next line commented because in latex mode, $$ unusefull for numbers */ /* fprintf (fgi->f, fgi->mode_latex ? "$%s$\\001\n" : "%s\\001\n", line);*/ fprintf (fgi->f, "%s\\001\n", line); } void DrawRect (Fig_info *fgi, int x1, int y1, int x2, int y2, int color, int depth, int bg_grey) { fprintf (fgi->f, "2 2 0 1 %d 7 %d 0 %d 0.000 0 0 -1 0 0 5\n", color, depth, bg_grey); x1 *= FIGR; y1 *= FIGR; x2 *= FIGR; y2 *= FIGR; fprintf (fgi->f, " %d %d %d %d %d %d %d %d %d %d\n", x1, y1, x2, y1, x2, y2, x1, y2, x1, y1); } void Draw3DBorder (Fig_info *fgi, int x1, int y1, int x2, int y2, int color, int depth, int ty_r, int ty_b) { int dy = fgi->e3d_ih*FIGR, dx = fgi->e3d_iw*FIGR; x1 *= FIGR; y1 *= FIGR; x2 *= FIGR; y2 *= FIGR; if (ty_r == 1) { fprintf (fgi->f, "2 1 0 1 %d 7 %d -1 -1 0.000 0 0 -1 0 0 3\n", color, depth); fprintf (fgi->f, " %d %d %d %d %d %d\n", x2, y1, x2+dx, y1+dy, x2+dx, y2); } else if (ty_r == 2) { fprintf (fgi->f, "2 1 0 1 %d 7 %d -1 -1 0.000 0 0 -1 0 0 4\n", color, depth); fprintf (fgi->f, " %d %d %d %d %d %d %d %d\n", x2, y1, x2+dx, y1+dy, x2+dx, y2+dy, x2, y2); } if (ty_b == 1) { fprintf (fgi->f, "2 1 0 1 %d 7 %d -1 -1 0.000 0 0 -1 0 0 3\n", color, depth); fprintf (fgi->f, " %d %d %d %d %d %d\n", x1, y2, x1+dx, y2+dy, x2, y2+dy); } else if (ty_b == 2) { fprintf (fgi->f, "2 1 0 1 %d 7 %d -1 -1 0.000 0 0 -1 0 0 4\n", color, depth); fprintf (fgi->f, " %d %d %d %d %d %d %d %d\n", x1, y2, x1+dx, y2+dy, x2+dx, y2+dy, x2, y2); } } void WriteFig_2c (Npic_image *np1, Fig_info *fgi) { Npic_image_2c *p1 = NpicCastImage (np1); int x, y, x1, y1, x2, y2; char bla[256]; HeaderFig(fgi); x1 = fgi->box_x; x2 = fgi->box_x + fgi->box_w; y1 = fgi->box_y; y2 = fgi->box_y + fgi->box_h; if (x1 < 0 || x1 >= p1->xmax) x1 = 0; if (y1 < 0 || y1 >= p1->ymax) y1 = 0; if (x2 < 0 || x2 > p1->xmax) x2 = p1->xmax; if (y2 < 0 || y2 > p1->ymax) y2 = p1->ymax; for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) { int i, bg_grey = -1; for (i = 0; i < fgi->bg_nb; i++) if (fgi->bg_a[i] <= p1->pix[y][x] && p1->pix[y][x] <= fgi->bg_b[i]) bg_grey = fgi->bg_g[i]; if (fgi->norect == 0 || p1->pix[y][x] != 0) DrawRect (fgi, (x+1-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, bg_grey); } for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) if (fgi->nozero == 0 || p1->pix[y][x] != 0) { sprintf (bla, "%d" , p1->pix[y][x]); DrawString (fgi, (x-x1)*fgi->zoom_w+3*fgi->zoom_w/2, (y-y1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->font_size, fgi->font_height); } if (fgi->coords_show) { for (y = y1; y < y2; y++) { sprintf (bla, "%d" , fgi->coords_origy++); DrawString (fgi, (-1)*fgi->zoom_w+3*fgi->zoom_w/2, (y-y1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->coords_font, fgi->coords_height); } for (x = x1; x < x2; x++) { sprintf (bla, "%d" , fgi->coords_origx++); DrawString (fgi, (x-x1)*fgi->zoom_w+3*fgi->zoom_w/2, (-1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->coords_font, fgi->coords_height); } } if (fgi->e3d_show) { if (fgi->norect == 0) { for (y = y1; y < y2; y++) Draw3DBorder (fgi, (x2+0-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x2+1-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, 2, 0); for (x = x1; x < x2; x++) Draw3DBorder (fgi, (x+1-x1)*fgi->zoom_w, (y2+0-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y2+1-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, 0, 2); } else { for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) if (p1->pix[y][x] != 0) { int ty_r = 0, ty_b = 0; if (x == x2-1) ty_r = 2; else if (p1->pix[y][x+1] == 0) ty_r = (y != y2-1 && p1->pix[y+1][x+1] != 0) ? 1 : 2; if (y == y2-1) ty_b = 2; else if (p1->pix[y+1][x] == 0) ty_b = (x != x2-1 && p1->pix[y+1][x+1] != 0) ? 1 : 2; if (ty_r+ty_b > 0) Draw3DBorder (fgi, (x+1-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, ty_r, ty_b); } } } } void WriteFig_2l (Npic_image *np1, Fig_info *fgi) { Npic_image_2l *p1 = NpicCastImage (np1); int x, y, x1, y1, x2, y2; char bla[256]; HeaderFig(fgi); x1 = fgi->box_x; x2 = fgi->box_x + fgi->box_w; y1 = fgi->box_y; y2 = fgi->box_y + fgi->box_h; if (x1 < 0 || x1 >= p1->xmax) x1 = 0; if (y1 < 0 || y1 >= p1->ymax) y1 = 0; if (x2 < 0 || x2 > p1->xmax) x2 = p1->xmax; if (y2 < 0 || y2 > p1->ymax) y2 = p1->ymax; for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) { int i, bg_grey = -1; for (i = 0; i < fgi->bg_nb; i++) if (fgi->bg_a[i] <= p1->pix[y][x] && p1->pix[y][x] <= fgi->bg_b[i]) bg_grey = fgi->bg_g[i]; if (fgi->norect == 0 || p1->pix[y][x] != 0) DrawRect (fgi, (x+1-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, bg_grey); } for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) if (fgi->nozero == 0 || p1->pix[y][x] != 0) { sprintf (bla, "%" NPIC_PL , p1->pix[y][x]); DrawString (fgi, (x-x1)*fgi->zoom_w+3*fgi->zoom_w/2, (y-y1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->font_size, fgi->font_height); } if (fgi->coords_show) { for (y = y1; y < y2; y++) { sprintf (bla, "%d" , fgi->coords_origy++); DrawString (fgi, (-1)*fgi->zoom_w+3*fgi->zoom_w/2, (y-y1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->coords_font, fgi->coords_height); } for (x = x1; x < x2; x++) { sprintf (bla, "%d" , fgi->coords_origx++); DrawString (fgi, (x-x1)*fgi->zoom_w+3*fgi->zoom_w/2, (-1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->coords_font, fgi->coords_height); } } if (fgi->e3d_show) { if (fgi->norect == 0) { for (y = y1; y < y2; y++) Draw3DBorder (fgi, (x2+0-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x2+1-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, 2, 0); for (x = x1; x < x2; x++) Draw3DBorder (fgi, (x+1-x1)*fgi->zoom_w, (y2+0-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y2+1-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, 0, 2); } else { for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) if (p1->pix[y][x] != 0) { int ty_r = 0, ty_b = 0; if (x == x2-1) ty_r = 2; else if (p1->pix[y][x+1] == 0) ty_r = (y != y2-1 && p1->pix[y+1][x+1] != 0) ? 1 : 2; if (y == y2-1) ty_b = 2; else if (p1->pix[y+1][x] == 0) ty_b = (x != x2-1 && p1->pix[y+1][x+1] != 0) ? 1 : 2; if (ty_r+ty_b > 0) Draw3DBorder (fgi, (x+1-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, ty_r, ty_b); } } } } void WriteFig_2d (Npic_image *np1, Fig_info *fgi) { Npic_image_2d *p1 = NpicCastImage (np1); int x, y, x1, y1, x2, y2; char bla[256]; HeaderFig(fgi); x1 = fgi->box_x; x2 = fgi->box_x + fgi->box_w; y1 = fgi->box_y; y2 = fgi->box_y + fgi->box_h; if (x1 < 0 || x1 >= p1->xmax) x1 = 0; if (y1 < 0 || y1 >= p1->ymax) y1 = 0; if (x2 < 0 || x2 > p1->xmax) x2 = p1->xmax; if (y2 < 0 || y2 > p1->ymax) y2 = p1->ymax; for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) { int i, bg_grey = -1; for (i = 0; i < fgi->bg_nb; i++) if (fgi->bg_a[i] <= p1->pix[y][x] && p1->pix[y][x] <= fgi->bg_b[i]) bg_grey = fgi->bg_g[i]; if (fgi->norect == 0 || p1->pix[y][x] != 0) DrawRect (fgi, (x+1-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, bg_grey); } for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) if (fgi->nozero == 0 || p1->pix[y][x] != 0) { sprintf (bla, "%.2f" , p1->pix[y][x]); DrawString (fgi, (x-x1)*fgi->zoom_w+3*fgi->zoom_w/2, (y-y1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->font_size, fgi->font_height); } if (fgi->coords_show) { for (y = y1; y < y2; y++) { sprintf (bla, "%d" , fgi->coords_origy++); DrawString (fgi, (-1)*fgi->zoom_w+3*fgi->zoom_w/2, (y-y1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->coords_font, fgi->coords_height); } for (x = x1; x < x2; x++) { sprintf (bla, "%d" , fgi->coords_origx++); DrawString (fgi, (x-x1)*fgi->zoom_w+3*fgi->zoom_w/2, (-1)*fgi->zoom_h+3*fgi->zoom_h/2, bla, fgi->color_num, fgi->depth_num, fgi->coords_font, fgi->coords_height); } } if (fgi->e3d_show) { if (fgi->norect == 0) { for (y = y1; y < y2; y++) Draw3DBorder (fgi, (x2+0-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x2+1-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, 2, 0); for (x = x1; x < x2; x++) Draw3DBorder (fgi, (x+1-x1)*fgi->zoom_w, (y2+0-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y2+1-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, 0, 2); } else { for (y = y1; y < y2; y++) for (x = x1; x < x2; x++) if (p1->pix[y][x] != 0) { int ty_r = 0, ty_b = 0; if (x == x2-1) ty_r = 2; else if (p1->pix[y][x+1] == 0) ty_r = (y != y2-1 && p1->pix[y+1][x+1] != 0) ? 1 : 2; if (y == y2-1) ty_b = 2; else if (p1->pix[y+1][x] == 0) ty_b = (x != x2-1 && p1->pix[y+1][x+1] != 0) ? 1 : 2; if (ty_r+ty_b > 0) Draw3DBorder (fgi, (x+1-x1)*fgi->zoom_w, (y+1-y1)*fgi->zoom_h, (x+2-x1)*fgi->zoom_w, (y+2-y1)*fgi->zoom_h, fgi->color_rect, fgi->depth_rect, ty_r, ty_b); } } } } void ArgcExit (int argc, int n) { if (argc < n) { fprintf (stderr, "ERROR: %d argument(s) missing, " "type \"npic-xfig -h\" to get help.\n", n-argc); exit (1); } } void ArgShift (int *argc, char **argv[], int n) { *argc -= n; *argv += n; } int main (int argc, char *argv[]) { char *in1, *out1; Npic_image *np1; Fig_info fgi; InitFig (&fgi); ArgcExit (argc, 1+1); if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "-help") == 0 || strcmp (argv[1], "--help") == 0) { ShowUsage (); exit (0); } ArgcExit (argc, 2+1); in1 = argv[1]; out1 = argv[2]; ArgShift (&argc, &argv, 2); while (argc > 1) { if (strcmp (argv[1], "-box") == 0) { ArgcExit (argc, 5+1); fgi.box_y = atoi(argv[2]); fgi.box_x = atoi(argv[3]); fgi.box_h = atoi(argv[4]); fgi.box_w = atoi(argv[5]); fgi.coords_origy = fgi.box_y; fgi.coords_origx = fgi.box_x; ArgShift (&argc, &argv, 5); } else if (strcmp (argv[1], "-latex") == 0) { ArgcExit (argc, 1+1); fgi.mode_latex = 1; ArgShift (&argc, &argv, 1); } else if (strcmp (argv[1], "-font") == 0) { ArgcExit (argc, 2+1); fgi.font_size = atoi(argv[2]); fgi.font_height = fgi.font_size*FIGR; ArgShift (&argc, &argv, 2); } else if (strcmp (argv[1], "-size") == 0) { ArgcExit (argc, 3+1); fgi.rect_size_h = atof(argv[2]); fgi.rect_size_w = atof(argv[3]); fgi.zoom_h = fgi.rect_size_h*450/FIGR; fgi.zoom_w = fgi.rect_size_w*450/FIGR; ArgShift (&argc, &argv, 3); } else if (strcmp (argv[1], "-nozero") == 0) { ArgcExit (argc, 1+1); fgi.nozero = 1; ArgShift (&argc, &argv, 1); } else if (strcmp (argv[1], "-norect") == 0) { ArgcExit (argc, 1+1); fgi.norect = 1; ArgShift (&argc, &argv, 1); } else if (strcmp (argv[1], "-coords") == 0) { ArgcExit (argc, 1+1); fgi.coords_show = 1; ArgShift (&argc, &argv, 1); } else if (strcmp (argv[1], "-co-orig") == 0) { ArgcExit (argc, 3+1); fgi.coords_origy = atoi(argv[2]); fgi.coords_origx = atoi(argv[3]); ArgShift (&argc, &argv, 3); } else if (strcmp (argv[1], "-co-font") == 0) { ArgcExit (argc, 2+1); fgi.coords_font = atoi(argv[2]); fgi.coords_height = fgi.coords_font*FIGR; ArgShift (&argc, &argv, 2); } else if (strcmp (argv[1], "-3d") == 0) { ArgcExit (argc, 1+1); fgi.e3d_show = 1; ArgShift (&argc, &argv, 1); } else if (strcmp (argv[1], "-3d-size") == 0) { ArgcExit (argc, 3+1); fgi.e3d_size_h = atof(argv[2]); fgi.e3d_size_w = atof(argv[3]); fgi.e3d_ih = fgi.e3d_size_h*450/FIGR; fgi.e3d_iw = fgi.e3d_size_w*450/FIGR; ArgShift (&argc, &argv, 3); } else if (strcmp (argv[1], "-bg") == 0) { ArgcExit (argc, 4+1); if (fgi.bg_nb >= BGNB) { fprintf (stderr, "ERROR: maximum -bg exceeded\n"); exit (1); } fgi.bg_a[fgi.bg_nb] = atoi(argv[2]); fgi.bg_b[fgi.bg_nb] = atoi(argv[3]); fgi.bg_g[fgi.bg_nb] = atoi(argv[4]) / 5; fgi.bg_nb++; ArgShift (&argc, &argv, 4); } else if (strcmp (argv[1], "-show") == 0) { ArgcExit (argc, 1+1); fgi.show_result = 1; ArgShift (&argc, &argv, 1); } else { fprintf (stderr, "ERROR: unknown argument \"%s\", " "type \"npic-xfig -h\" to get help.\n", argv[1]); exit (1); } } printf ("Loading \"%s\"\n", in1); np1 = NpicReadImage (in1); if (np1 == NULL) exit (1); switch (np1->type) { case NPIC_IMAGE_2C : break; case NPIC_IMAGE_2L : break; case NPIC_IMAGE_2D : break; default : fprintf (stderr, "ERROR, not a 2C, 2L or 2D image\n"); exit (1); } fgi.f = fopen (out1, "w"); if (fgi.f == NULL) { fprintf (stderr, "ERROR: can't write file \"%s\"\n", out1); exit (1); } printf ("Saving \"%s\" ...\n", out1); switch (np1->type) { case NPIC_IMAGE_2C : WriteFig_2c (np1, &fgi); break; case NPIC_IMAGE_2L : WriteFig_2l (np1, &fgi); break; case NPIC_IMAGE_2D : WriteFig_2d (np1, &fgi); break; } fclose (fgi.f); printf ("Done\n"); if (fgi.show_result) { printf ("Showing result with xfig ...\n"); execlp ("xfig", "xfig", out1, NULL); perror ("exec xfig"); exit (1); } exit (0); }