home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / CONTRIB / MBASE / MBASE50.TAR / mbase / src / form_wr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-28  |  9.1 KB  |  378 lines

  1. /*
  2.  * METALBASE 5.0
  3.  *
  4.  * Released October 1st, 1992 by Huan-Ti [ richid@owlnet.rice.edu ]
  5.  *                                       [ t-richj@microsoft.com ]
  6.  *
  7.  * Special thanks go to Adrian Corston (adrian@internode.com.au) for his
  8.  * suggestions and code.  While this code is of my penning, the idea and
  9.  * style of implementation for this are direct ports from his own
  10.  * excellent work.
  11.  *
  12.  */
  13.  
  14. #include "mbase.h"
  15.  
  16. #ifndef MAXnREL
  17. #define MAXnREL 20    /* Max # of relations in any given DE form */
  18. #endif
  19. #ifndef MAXnFLD
  20. #define MAXnFLD 40    /* Max # of fields in any given DE form    */
  21. #endif
  22.  
  23. /*
  24.  * Definitions
  25.  *
  26.  */
  27.  
  28. #define LPARQ "("
  29. #define LBRCQ "{"   /* These are pulled out   */
  30. #define LBKT  '['   /* so that vi's ()/[]/{}  */
  31. #define LBRC  '{'   /* matchin works properly */
  32. #define RBRC  '}'   /* in moving through the  */
  33. #define RBKT  ']'   /* code.                  */
  34. #define RBRCQ "}"
  35. #define RPARQ ")"
  36.  
  37. #define fieldopt(x) (*(options[x]))
  38. #define fieldmode(x) (*(modes[x]))
  39. #define wrdata(x)   write (H, x, strlen(x));
  40. #define wrline(x) { wrdata(x); wrdata(SNGCR); }
  41.  
  42. /*
  43.  * Prototypes
  44.  *
  45.  */
  46.  
  47. #ifdef LONGARGS
  48.    extern void  id_field     (char *, char *);
  49.           void  writeit      (void);
  50.           void  wr_header    (void);
  51.           void  wr_buffer    (void);
  52.           void  wr_mode      (void);
  53.           void  wr_option    (void);
  54.           void  wr_field     (void);
  55.           void  wr_screen    (void);
  56.           void  wr_form      (void);
  57.           void  strqucpy     (char *, char *);
  58. #else
  59.    extern void  id_field();
  60.           void  writeit();
  61.           void  wr_header();
  62.           void  wr_header();
  63.           void  wr_buffer();
  64.           void  wr_mode();
  65.           void  wr_option();
  66.           void  wr_field();
  67.           void  wr_screen();
  68.           void  wr_form();
  69.           void  strqucpy();
  70. #endif
  71.  
  72. typedef char optlist[10][40];
  73. typedef int  modelist[20];
  74.  
  75. /*
  76.  * Global Variables
  77.  *
  78.  */
  79.  
  80. int  H;
  81.  
  82. extern char      formname[30];
  83. extern char      displ[25][140];
  84. extern int       num_l, pos_y, pos_x, num_f, num_m;
  85.  
  86. extern field     fld[MAXnFLD];
  87. extern int       lens[MAXnFLD];
  88. extern optlist  *options[MAXnFLD];
  89. extern modelist *modes[MAXnFLD];
  90.  
  91. void
  92. writeit ()
  93. {
  94.    int   i;
  95.    char  temp[128], *ptr;
  96.  
  97.    if ((ptr = strrchr (formname, '.')) != NULL)  *ptr = 0;
  98.  
  99.    sprintf (temp, "%-1.5s_fm.h", formname);
  100.  
  101.    if ((H = openx (temp, O_RDWR)) != -1)
  102.     { close  (H);
  103.       unlink (temp);
  104.     }
  105.    if ((H = creatx (temp)) == -1)
  106.     { fprintf (stderr, "cannot create %s -- aborted%s", temp, SNGCR);
  107.       mb_exit (10);
  108.     }
  109.    modex (temp, 0666);   /* Make the file   -rw-rw-rw-  */
  110.  
  111.    wr_header ();
  112.    wr_buffer ();
  113.    wr_mode   ();
  114.    wr_option ();
  115.    wr_field  ();
  116.    wr_screen ();
  117.    wr_form   ();
  118.  
  119.    close (H);
  120.  
  121.    for (i = 0; i < MAXnFLD; i++)
  122.     {
  123.       if (options[i] != (optlist *)0)
  124.        { free (options[i]);
  125.          options[i] = (optlist *)0;
  126.        }
  127.       if (modes[i] != (modelist *)0)
  128.        { free (modes[i]);
  129.          modes[i] = (modelist *)0;
  130.        }
  131.     }
  132.  
  133.    printf ("%-1.5s_fm.h written successfully\n", formname);
  134. }
  135.  
  136. void
  137. wr_header ()
  138. {
  139.    char  temp[128];
  140.    int   i;
  141.  
  142.    for (i = 0; formname[i] != 0; i++)
  143.       temp[i] = toupper (formname[i]);
  144.    temp[i] = 0;
  145.    strcat (temp, "_FM_H");
  146.  
  147.    wrdata ("#");  wrdata ("ifndef ");  wrline (temp);
  148.    wrdata ("#");  wrdata ("define ");  wrline (temp);  wrdata (SNGCR);
  149.  
  150.    wrdata ("/");  wrline ("*");
  151.    wrline (" * This file was created by MetalBase version 5.0 from the data-entry");
  152.    wrdata (" * template \"");  wrdata (formname);  wrdata (".frm");  wrline ("\"");
  153.    wrline (" *");
  154.    wrline (" * MetalBase 5.0 released October 1st by richid@owlnet.rice.edu");
  155.    wrline (" *");
  156.    wrdata (" *");  wrline ("/");
  157.    wrdata (SNGCR);
  158.  
  159.    wrdata ("#");  wrline ("ifdef MODULE");
  160.    wrdata ("   extern de_form ");  wrdata (formname);  wrline ("_fm;");
  161.    wrdata ("#");  wrline ("else");
  162. }
  163.  
  164. void
  165. wr_buffer ()
  166. {
  167.    char  temp[128];
  168.    int   i;
  169.  
  170.    for (i = 0; i < num_f; i++)
  171.       {
  172.       wrdata ("   ");
  173.       switch (fld[i].type)
  174.          {
  175.          case T_SHORT:   wrdata ("short    ");  break;
  176.          case T_USHORT:  wrdata ("ushort   ");  break;
  177.          case T_LONG:    wrdata ("long     ");  break;
  178.          case T_ULONG:   wrdata ("ulong    ");  break;
  179.          case T_FLOAT:   wrdata ("float    ");  break;
  180.          case T_DOUBLE:  wrdata ("double   ");  break;
  181.          case T_MONEY:   wrdata ("double   ");  break;
  182.          case T_TIME:    wrdata ("mb_time  ");  break;
  183.          case T_DATE:    wrdata ("mb_date  ");  break;
  184.          case T_SERIAL:  wrdata ("long     ");  break;
  185.          case T_PHONE:   wrdata ("mb_phone ");  break;
  186.          default:        wrdata ("char     ");  break;
  187.          }
  188.  
  189.       if (fld[i].type == T_CHAR)
  190.          sprintf (temp, "%s_f%d[%2d] = ", formname, i, lens[i]);
  191.       else
  192.          sprintf (temp, "%s_f%d     = ",  formname, i);
  193.       wrdata (temp);
  194.  
  195.       switch (fld[i].type)
  196.          {
  197.          case T_SHORT:   wrdata ("(short)0");     break;
  198.          case T_USHORT:  wrdata ("(ushort)0");    break;
  199.          case T_LONG:    wrdata ("0L");           break;
  200.          case T_ULONG:   wrdata ("(ulong)0L");    break;
  201.          case T_FLOAT:   wrdata ("(float)0.0");   break;
  202.          case T_DOUBLE:  wrdata ("(double)0.0");  break;
  203.          case T_MONEY:   wrdata ("(double)0.0");  break;
  204.          case T_TIME:    wrdata ("(mb_time)0");   break;
  205.          case T_DATE:    wrdata ("(mb_date)0");   break;
  206.          case T_SERIAL:  wrdata ("0L");           break;
  207.          default:        wrdata ("\"\"");         break;
  208.          }
  209.       wrline (";");
  210.       }
  211.    wrdata (SNGCR);
  212. }
  213.  
  214. void
  215. wr_mode ()
  216. {
  217.    char  temp[128];
  218.    int   i, j;
  219.  
  220.    for (i = 0; i < num_f; i++)
  221.     {
  222.       sprintf (temp, "   int %s_m%d[%d] = ", formname, i, num_m);
  223.       wrdata  (temp);
  224.       wrdata  (LBRCQ);
  225.       wrdata  (" ");
  226.  
  227.       for (j = 0; j < num_m; j++)
  228.        {
  229.          if (fieldmode(i)[j] == FM_INOUT)  strcpy (temp, "FM_INOUT");
  230.          if (fieldmode(i)[j] == FM_IN)     strcpy (temp, "FM_IN");
  231.          if (fieldmode(i)[j] == FM_OUT)    strcpy (temp, "FM_OUT");
  232.          if (j < num_m-1)  strcat (temp, ",");
  233.          strcat (temp, "     ");  temp[10] = 0;
  234.          wrdata (temp);
  235.        }
  236.       wrdata  (" ");
  237.       wrdata  (RBRCQ);
  238.       wrline  (";");
  239.     }
  240.  
  241.    wrdata (SNGCR);
  242. }
  243.  
  244. void
  245. wr_option ()
  246. {
  247.    char  temp[128];
  248.    int   i, j;
  249.  
  250.    for (i = 0; i < num_f; i++)
  251.       if (options[i] != (optlist *)0)
  252.        {
  253.          for (j = 1; j < 10; j++)
  254.             if (fieldopt(i)[j][0] == 0)  break;
  255.          sprintf (temp, "   char *%s_o%d[%d] = ", formname, i, j+1);
  256.          wrdata (temp);
  257.          wrdata (LBRCQ);
  258.          for (j = 0; j < 10; j++)
  259.             if (j != 0 && fieldopt(i)[j][0] == 0)  break;
  260.             else
  261.              {
  262.                if (j != 0)  wrdata (",");
  263.                wrdata (" \"");
  264.                wrdata (fieldopt(i)[j]);
  265.                wrdata ("\"");
  266.              }
  267.          wrdata (", \"\" ");
  268.          wrdata (RBRCQ);
  269.          wrline (";");
  270.        }
  271.    wrdata (SNGCR);
  272. }
  273.  
  274. void
  275. wr_field ()
  276. {
  277.    char  temp[128];
  278.    int   i;
  279.  
  280.    sprintf (temp, "   field %s_f[%d] =", formname, num_f);
  281.    wrline  (temp);
  282.  
  283.    for (i = 0; i < num_f; i++)
  284.     {
  285.       if (i == 0)
  286.        { wrdata ("    ");  wrdata (LBRCQ);  wrdata (" "); }
  287.       else
  288.        { wrline (",");  wrdata ("      "); }
  289.  
  290.       wrdata (LBRCQ);  wrdata (" ");
  291.  
  292.       sprintf (temp, "%2d, %2d, %2d,", fld[i].y, fld[i].x, fld[i].len);
  293.       wrdata  (temp);
  294.       sprintf (temp, " %2d, 0, %d,", fld[i].type, fld[i].option);
  295.       wrdata  (temp);
  296.       sprintf (temp, " %s_m%d,", formname, i);
  297.       wrdata  (temp);
  298.       wrdata ( (fld[i].type==T_CHAR || fld[i].type==T_PHONE) ? "  " : " &" );
  299.       sprintf (temp, "%s_f%d, \"%s\",", formname, i, fld[i].name);
  300.       wrdata  (temp);
  301.       if (options[i] == (optlist *)0)  strcpy (temp, " NULL ");
  302.       else
  303.          sprintf (temp, " %s_o%d ", formname, i);
  304.       wrdata  (temp);
  305.       wrdata  (RBRCQ);
  306.     }
  307.    wrdata (" ");  wrdata (RBRCQ);  wrline (";");
  308.  
  309.    wrdata (SNGCR);
  310. }
  311.  
  312. void
  313. wr_screen ()
  314. {
  315.    char  temp[128];
  316.    int   i;
  317.  
  318.    sprintf (temp, "   char *%s_s[%d] =", formname, num_l);
  319.    wrline (temp);
  320.  
  321.    for (i = 0; i < num_l; i++)
  322.     {
  323.       if (i == 0)
  324.        { wrdata ("    ");   wrdata (LBRCQ);   wrdata (" ");
  325.        }
  326.       else
  327.        { wrline (",");   wrdata ("      ");
  328.        }
  329.  
  330.       wrdata ("\"");
  331.       strqucpy (temp, displ[i]);
  332.       wrdata (temp);
  333.       wrdata ("\"");
  334.     }
  335.    wrdata ("  ");
  336.    wrdata (RBRCQ);
  337.    wrline (";");
  338.    wrdata (SNGCR);
  339. }
  340.  
  341. void
  342. strqucpy (oa, ob)
  343. char     *oa,*ob;
  344. {
  345.    register char *a, *b;
  346.    for (a=oa, b=ob; *b; a++,b++)
  347.       {
  348.       if (*b == '\"')
  349.          {
  350.          *a = '\\';
  351.          a++;
  352.          }
  353.       *a = *b;
  354.       }
  355.    *a = 0;
  356. }
  357.  
  358. void
  359. wr_form ()
  360. {
  361.    char  temp[128];
  362.  
  363.    wrdata ("   de_form "); wrdata (formname); wrline ("_fm =");
  364.    wrdata ("    ");  wrdata (LBRCQ);
  365.  
  366.    sprintf (temp, " 1, 0, 0, 0, %d, %d, (int_fn)0, %d,", num_f, num_m, num_l);
  367.    wrdata  (temp);
  368.    sprintf (temp, " %d, %d, %s_f, %s_s ", pos_y, pos_x, formname, formname);
  369.    wrdata  (temp);
  370.    wrdata  (RBRCQ);
  371.    wrline  (";");
  372.  
  373.    wrdata (SNGCR);
  374.    wrdata ("#");  wrline ("endif");  wrdata (SNGCR);
  375.    wrdata ("#");  wrline ("endif");  wrdata (SNGCR);
  376. }
  377.  
  378.