wmlsc.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:7k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wmlsc.c
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Main for the WMLScript compiler.
  11.  *
  12.  */
  13. #include "config.h"
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <errno.h>
  18. #if HAVE_UNISTD_H
  19. #include <unistd.h>
  20. #endif /* HAVE_UNISTD_H */
  21. #include <sys/types.h>
  22. #include <sys/stat.h>
  23. #include "ws.h"
  24. #include "gwlib/gwlib.h"
  25. /* XXX This module, as well, should use the gwmem wrappers. We'll change
  26.    this later. --liw */
  27. #undef malloc
  28. #undef realloc
  29. #undef free
  30. /********************* Prototypes for static functions ******************/
  31. /* Print usage message to the stdout. */
  32. static void usage(void);
  33. /* A callback function to receive the meta-pragmas. */
  34. static void pragma_meta(const WsUtf8String *property_name,
  35.                         const WsUtf8String *content,
  36.                         const WsUtf8String *scheme,
  37.                         void *context);
  38. /********************* Static variables *********************************/
  39. /* The name of the compiler program. */
  40. static char *program;
  41. /* Use ws_compile_data() instead of ws_compile_file(). */
  42. static int eval_data = 0;
  43. /********************* Global functions *********************************/
  44. int main(int argc, char *argv[])
  45. {
  46.     int i;
  47.     WsCompilerParams params;
  48.     WsCompilerPtr compiler;
  49.     WsResult result;
  50.     int opt;
  51.     program = strrchr(argv[0], '/');
  52.     if (program)
  53.         program++;
  54.     else
  55.         program = argv[0];
  56.     /* Initialize the parameters structure.  The command line options
  57.        modify this directly. */
  58.     memset(&params, 0, sizeof(params));
  59.     /* Process command line arguments. */
  60.     while ((opt = getopt(argc, argv, "adhsv")) != EOF) {
  61.         switch (opt) {
  62.         case 'a':
  63.             params.print_assembler = 1;
  64.             break;
  65.         case 'd':
  66.             eval_data = 1;
  67.             break;
  68.         case 'h':
  69.             usage();
  70.             exit(0);
  71.             break;
  72.         case 'l':
  73.             params.use_latin1_strings = 1;
  74.             break;
  75.         case 'p':
  76.             params.meta_name_cb = pragma_meta;
  77.             params.meta_name_cb_context = "meta name";
  78.             params.meta_http_equiv_cb = pragma_meta;
  79.             params.meta_http_equiv_cb_context = "meta http equiv";
  80.             break;
  81.         case 's':
  82.             params.print_symbolic_assembler = 1;
  83.             break;
  84.         case 'v':
  85.             params.verbose = 1;
  86.             break;
  87.         case '?':
  88.             printf("Try `%s -h' for a complete list of options.n",
  89.                    program);
  90.             exit(1);
  91.         }
  92.     }
  93.     /* Create compiler. */
  94.     compiler = ws_create(&params);
  95.     if (compiler == NULL) {
  96.         fprintf(stderr, "wsc: could not create compilern");
  97.         exit(1);
  98.     }
  99.     for (i = optind; i < argc; i++) {
  100.         FILE *ifp, *ofp;
  101.         char *outname;
  102.         ifp = fopen(argv[i], "rb");
  103.         if (ifp == NULL) {
  104.             fprintf(stderr, "wsc: could not open input file `%s': %s'n",
  105.                     argv[i], strerror(errno));
  106.             exit(1);
  107.         }
  108.         /* Create the output name. */
  109.         outname = malloc(strlen(argv[i]) + 1 + 1);
  110.         if (outname == NULL) {
  111.             fprintf(stderr, "wmlsc: could not create output file name: %sn",
  112.                     strerror(errno));
  113.             exit(1);
  114.         }
  115.         strcpy(outname, argv[i]);
  116.         strcat(outname, "c");
  117.         ofp = fopen(outname, "wb");
  118.         if (ofp == NULL) {
  119.             fprintf(stderr, "wsc: could not create output file `%s': %sn",
  120.                     outname, strerror(errno));
  121.             exit(1);
  122.         }
  123.         if (eval_data) {
  124.             /* Use the ws_compile_data() interface. */
  125.             struct stat stat_st;
  126.             unsigned char *data;
  127.             unsigned char *output;
  128.             size_t output_len;
  129.             if (stat(argv[i], &stat_st) == -1) {
  130.                 fprintf(stderr, "wsc: could not stat input file `%s': %sn",
  131.                         argv[i], strerror(errno));
  132.                 exit(1);
  133.             }
  134.             /* Allocate the input buffer. */
  135.             data = malloc(stat_st.st_size);
  136.             if (data == NULL) {
  137.                 fprintf(stderr, "wsc: could not allocate input buffer: %sn",
  138.                         strerror(errno));
  139.                 exit(1);
  140.             }
  141.             if (fread(data, 1, stat_st.st_size, ifp) < (size_t) stat_st.st_size) {
  142.                 fprintf(stderr, "wsc: could not read data: %sn",
  143.                         strerror(errno));
  144.                 exit(1);
  145.             }
  146.             result = ws_compile_data(compiler, argv[i], data, stat_st.st_size,
  147.                                      &output, &output_len);
  148.             if (result == WS_OK) {
  149.                 /* Save the output to `ofp'. */
  150.                 if (fwrite(output, 1, output_len, ofp) != output_len) {
  151.                     fprintf(stderr,
  152.                             "wsc: could not save output to file `%s': %sn",
  153.                             outname, strerror(errno));
  154.                     exit(1);
  155.                 }
  156.             }
  157.             free(data);
  158.             ws_free_byte_code(output);
  159.         } else {
  160.             /* Use the ws_compile_file() interface. */
  161.             result = ws_compile_file(compiler, argv[i], ifp, ofp);
  162.         }
  163.         /* Common cleanup. */
  164.         fclose(ifp);
  165.         fclose(ofp);
  166.         if (result != WS_OK) {
  167.             remove(outname);
  168.             fprintf(stderr, "wsc: compilation failed: %sn",
  169.                     ws_result_to_string(result));
  170.             exit(1);
  171.         }
  172.         free(outname);
  173.     }
  174.     ws_destroy(compiler);
  175.     return 0;
  176. }
  177. /********************* Static functions *********************************/
  178. static void usage(void)
  179. {
  180.     printf("Usage: %s OPTION... FILE...n
  181.            n
  182.            -a            disassemble resulting byte-code and print it to then
  183.            standard outputn
  184.            -d use ws_eval_data() function instead of ws_eval_file()n
  185.            -h            print this help message and exit successfullyn
  186.            -l            encode strings in ISO-8859/1 (ISO latin1) instead of usingn
  187.            UTF-8n
  188.            -p            print pragmasn
  189.            -s            print symbolic byte-code assembler to the standard outputn
  190.            -v            print verbose progress messagesn
  191.            n",
  192.            program);
  193. }
  194. static void pragma_meta(const WsUtf8String *property_name,
  195.                         const WsUtf8String *content,
  196.                         const WsUtf8String *scheme, void *context)
  197. {
  198.     FILE *fp = stdout;
  199.     char *what = (char *) context;
  200.     char *property_name_l = (char *) ws_utf8_to_latin1(property_name, '?', NULL);
  201.     char *content_l = (char *) ws_utf8_to_latin1(content, '?', NULL);
  202.     char *scheme_l = (char *) ws_utf8_to_latin1(scheme, '?', NULL);
  203.     fprintf(fp, "%s: name="%s", content="%s",",
  204.             what,
  205.             property_name_l ? property_name_l : "",
  206.             content_l ? content_l : "");
  207.     if (scheme)
  208.         fprintf(fp, ", scheme="%s"",
  209.                 scheme_l ? scheme_l : "");
  210.     fprintf(fp, "n");
  211.     ws_utf8_free_data((unsigned char *) property_name_l);
  212.     ws_utf8_free_data((unsigned char *) content_l);
  213.     ws_utf8_free_data((unsigned char *) scheme_l);
  214. }