Nuovo esempio (funzionante) e primo abbozzo delle spiegazioni delle fifo.
[gapil.git] / sources / BarCode.c
index 7852dae397a3bd165cab915e290b7743516f121e..4164acf1b2392782a0d74808fefb5ea1d310057f 100644 (file)
@@ -18,7 +18,7 @@
  */
 /****************************************************************
  *
- * Program echod 
+ * Program barcode 
  * CGI for barcode generation
  *
  * Author: Simone Piccardi
@@ -29,7 +29,7 @@
  * http://localhost/cgi-bin/barcode?string
  * where string is the code to be converted
  *
- * $Id: BarCode.c,v 1.2 2002/06/21 22:24:10 piccardi Exp $ 
+ * $Id: BarCode.c,v 1.5 2002/06/28 21:07:21 piccardi Exp $ 
  *
  ****************************************************************/
 /* 
@@ -57,75 +57,31 @@ int main(int argc, char *argv[], char *envp[])
 /*
  * Variables definition         
  */
-    pid_t pid;
-    int retval;
-    int pipein[2];
-    int pipeout[2];
-    char content[]="Content-type: image/jpeg\n\n";
-    char size[]="-pA9";
-    /* 
-     * Begin
-     */
-    /* create two pipes to handle process communication */
-    if ( (retval = pipe(pipein)) ) {
-       WriteMess("input pipe creation error");
-       exit(0);        
+    FILE *pipe[4];
+    FILE *pipein;
+    char *cmd_string[4]={
+       "pnmtopng",
+       "pnmmargin -white 10",
+       "pnmcrop",
+       "gs -sDEVICE=ppmraw -sOutputFile=- -sNOPAUSE -q - -c showpage -c quit"
+    }; 
+    char content[]="Content-type: image/png\n\n";
+    int i;
+    /* write mime-type to stout */ 
+    write(STDOUT_FILENO, content, strlen(content));
+    /* execute chain of command */
+    for (i=0; i<4; i++) {
+       pipe[i] = popen(cmd_string[i], "w");
+       dup2(fileno(pipe[i]), STDOUT_FILENO); 
     }
-    if ( (retval = pipe(pipeout)) ) {
-       WriteMess("output pipe creation error");
-       exit(0);        
-    }   
-    /* fork child to run barcode program */
-    pid = fork();
-    if (pid == -1) {
-       WriteMess("child creation error");
-       exit(0);        
+    /* create barcode (in PS) */
+    pipein = popen("barcode", "w");
+    /* send barcode string to barcode program */
+    write(fileno(pipein), argv[1], strlen(argv[1]));
+    /* close all pipes (in reverse order) */
+    for (i=4; i==0; i--) {
+       pclose((pipe[i]));
     }
-    /* if child */
-    if (pid == 0) {
-       /*
-        * Child exec barcode program, that take input (string to encode)
-        * from pipein, remapped to stdin, and write the output (a PS
-        * image) to stdout, remapped to pipeout 
-        */
-       close(pipein[1]);                /* close output side of input pipe */
-       dup2(pipein[0], STDIN_FILENO);   /* remap stdin in pipe input */
-       close(pipeout[0]);
-       dup2(pipeout[1], STDOUT_FILENO); /* remap stdout in pipe output */
-       execlp("barcode", "barcode", size, NULL); //"-o", "-",  NULL);
-    } 
-    /*
-     * Parent write string to pipe input and close it, 
-     * then wait child execution and results form pipeout, 
-     * then fork to convert PS to JPEG using gs
-     */
-    close(pipein[0]);        /* close input side of input pipe */
-    write(pipein[1], argv[1], strlen(argv[1]));
-    close(pipein[1]);
-    waitpid(pid, NULL, 0);
-    /* 
-     * refork to use gs
-     */
-    pid = fork();
-    if (pid == -1) {
-       WriteMess("child creation error");
-       exit(0);
-    }
-    /*
-     * second child, convert PS to JPEG
-     */
-    if (pid == 0) {
-       /* send mime type */
-       close(pipeout[1]);
-       dup2(pipeout[0], STDIN_FILENO);
-       write(STDOUT_FILENO, content, strlen(content));
-       execlp("gs", "gs", "-q", "-sDEVICE=jpeg", "-sOutputFile=-", "-", NULL);
-    }
-    /*
-     * still parent
-     */
-    close(pipeout[1]);
-    waitpid(pid, NULL, 0);
     exit(0);
 }
 /*