⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callable_postmini_cbind.c

📁 this file is contain important facts aboute different programming langueges.
💻 C
字号:
/*
      Copyright (c) 1999,2000, Compaq Computer Corporation

      See the file "license.terms" for information on usage and redistribution
      of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 */
/*
 *
 *   C interface to callable Postmini
 *
 */

#if !(defined(vms) || defined(__vms))
/* Most Unix FORTRAN's append an underscore to external names */
#define pmplxy pmplxy_
#define pmplot pmplot_
#define pmcomp pmcomp_
#define pmclxy pmclxy_
#define pmadxy pmadxy_
#define pmlab  pmlab_
#define pmdef  pmdef_
#define pmtitl pmtitl_
#define pmcltl pmcltl_
#define pmcllb pmcllb_
#define pmclos pmclos_
#define pmcont pmcont_
#endif

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#if defined(vms) || defined(__vms)
#include <descrip.h>
/* VMS FORTRAN RTL barks if you pass it a character string that is 256
   characters long... */
#define PM_MAXPATHLEN (FILENAME_MAX - 1)
#else
#define PM_MAXPATHLEN FILENAME_MAX
#endif

#include "callable_postmini_cbind.h"

extern void pmplxy(), pmplot(), pmclxy(), pmadxy(), pmlab(),
            pmdef(), pmtitl(), pmcltl(), pmcllb(), pmclos();

static char   *buffer = NULL;
static char   pmfile_buffer[PM_MAXPATHLEN];

#define MAX(a,b)  (a)>(b) ? (a) : (b)
#define MIN(a,b)  (a)<(b) ? (a) : (b)

char *PmPlotXY(float *float_data, int  *int_data,
               int   *log_data,   char *char_data[],
               int nfloat, int nint, int nlog, int nchar,
               char *title, char *hcfile, int ilu, int linter, char *pmfile)
{

   int ilen, istr, i;

#if defined(vms) || defined(__vms)
   struct dsc$descriptor hcfile_dsc, pmfile_dsc, title_dsc;
   struct dsc$descriptor_a array_dsc;
#else
   int ilen1, ilen2, ilen3;
#endif

   /* Copy string data (if any) to fixed length, blank filled, strings
      for FORTRAN */
   /* As a firewall against nchar>0, but empty input strings,
      set minimum length to 1 */
   ilen = 1;
   for(i=0; i<nchar; i++) {
      ilen=MAX(ilen,strlen(char_data[i]));
   }

   if( nchar > 0 ) {
      if( (buffer = malloc(ilen*nchar)) == NULL ) {
         perror("PmaddXY");
         return;
      }
      /* Set temporary buffer to all blanks, then store string information */
      memset(buffer,' ',ilen*nchar);
      for(i=0; i<nchar; i++) {
         istr=strlen(char_data[i]);
         memcpy(&buffer[i*ilen],char_data[i],MIN(ilen,istr));
      }
   }

#if defined(vms) || defined(__vms)
   PmInitStringArrayDescriptor(&array_dsc);
   PmSetStringArrayDescriptor(&array_dsc,buffer,nchar,ilen);
   PmInitStringDescriptor(&title_dsc);
   PmSetStringDescriptorConst(&title_dsc,title);
   PmInitStringDescriptor(&hcfile_dsc);
   PmSetStringDescriptorConst(&hcfile_dsc,hcfile);
   PmInitStringDescriptor(&pmfile_dsc);
   PmSetStringDescriptorVar(&pmfile_dsc,pmfile_buffer,pmfile,PM_MAXPATHLEN);
   pmplxy(float_data, int_data, log_data, &array_dsc,
          &nfloat, &nint, &nlog, &nchar,
          &title_dsc, &hcfile_dsc, &ilu, &linter, &pmfile_dsc);
#else
   ilen1 = ilen;
   ilen2 = strlen(title);
   ilen3 = strlen(hcfile);
   memset(pmfile_buffer,' ',PM_MAXPATHLEN);
   memcpy(pmfile_buffer,pmfile,MIN(strlen(pmfile),PM_MAXPATHLEN));
   pmplxy(float_data, int_data, log_data, buffer,
          &nfloat, &nint, &nlog, &nchar,
           title, hcfile, &ilu, &linter, pmfile_buffer,
           ilen1, ilen2, ilen3, PM_MAXPATHLEN);
#endif

   /* Null terminate string, remember, array is zero based */
   for(i=PM_MAXPATHLEN-2; i>0; i-- ) {
      if( pmfile_buffer[i] != ' ' ) {
         pmfile_buffer[i+1] = '\0';
         break;
      }
   }
   return(pmfile_buffer);
}

char  *PmMainMenu(float *float_data, int  *int_data,
                 int   *log_data,   char *char_data[],
                 int nfloat, int nint, int nlog, int nchar,
                 char *title, char *hcfile, int ilu, int linter, char *pmfile)
{
   printf("This jacket routine is not implemented yet!\n");
   return NULL;
}

void PmClearXY(void)
{
   pmclxy();
}
 
int  PmAddXY(float *x, float *y, int nd,
               float *float_data, int *int_data,
               int   *log_data,   char *char_data[],
               int   nfloat, int nint, int nlog, int nchar,
               int *icode1, int *icode2)
{

   int ilen, istr, i, ierr;
#if defined(vms) || defined(__vms)
   struct dsc$descriptor_a array_dsc;
#endif

   /* Copy string data (if any) to fixed length, blank filled, strings
      for FORTRAN */
   /* As a firewall against nchar>0, but empty input strings,
      set minimum length to 1 */
   ilen = 1;
   for(i=0; i<nchar; i++) {
      ilen=MAX(ilen,strlen(char_data[i]));
   }

   if( nchar > 0 ) {
      if( (buffer = malloc(ilen*nchar)) == NULL ) {
         perror("PmAddXY");
         return(PM_FAILURE);
      }
      /* Set temporary buffer to all blanks, then store string information */
      memset(buffer,' ',ilen*nchar);
      for(i=0; i<nchar; i++) {
         istr=strlen(char_data[i]);
         memcpy(&buffer[i*ilen],char_data[i],MIN(ilen,istr));
      }
   }

#if defined(vms) || defined(__vms)
   PmInitStringArrayDescriptor(&array_dsc);
   PmSetStringArrayDescriptor(&array_dsc,buffer,nchar,ilen);
   pmadxy(x, y, &nd, float_data, int_data, log_data, &array_dsc,
                     &nfloat,    &nint,    &nlog,    &nchar,
                     &ierr,      icode1,  icode2);
#else

   pmadxy(x, y, &nd, float_data, int_data, log_data,  buffer,
                     &nfloat,    &nint,    &nlog,    &nchar,
                     &ierr,       icode1,   icode2,   ilen);
#endif

   if( buffer != NULL ) {
      free(buffer);
      buffer = NULL;
   }
   return(ierr);
}

int PmSetDefault(int    icode,
                 float *float_data,
                 int   *int_data,
                 int   *logical_data,
                 char  *string)
{

   int rc,ilen;

#if defined(vms) || defined(__vms)
   struct dsc$descriptor dsc;
   PmInitStringDescriptor(&dsc);
   PmSetStringDescriptorConst(&dsc, string);
   pmdef(&icode,float_data,int_data,logical_data,&dsc,&rc);
#else
   ilen = strlen(string);
   pmdef(&icode,float_data,int_data,logical_data,string,&rc,ilen);
#endif

   return(rc);
}

int PmSetTitle(char *title)
{

   int rc, ilen;

#if defined(vms) || defined(__vms)
   struct dsc$descriptor dsc;

   PmInitStringDescriptor(&dsc);
   PmSetStringDescriptorConst(&dsc, title);
   pmtitl(&dsc, &rc);
#else
   ilen = strlen(title);
   pmtitl(title, &rc, ilen);
#endif

   return rc;

}

void PmClearTitle()
{
   pmcltl();
}

int PmSetLabel(char *label)
{
   int rc;
   int ilen;

#if defined(vms) || defined(__vms)
   struct dsc$descriptor dsc;

   PmInitStringDescriptor(&dsc);
   PmSetStringDescriptorConst(&dsc, label);
   pmlab(&dsc, &rc);
#else
   ilen = strlen(label);
   pmlab(label, &rc, ilen);
#endif

   return(rc);
}

void PmClearLabel(void)
{
   pmcllb();
}

void PmClose(void)
{
   pmclos();
}

char *PmContour(float *data2d, float *posx, float *posy,
                int iposx, int iposy,
                char *title, char *quantity, char *units,
                int llinear, int ilu, int linter, char *pmfile)
{

   int ilen, istr, i;
   void pmcont();

#if defined(vms) || defined(__vms)
   struct dsc$descriptor title_dsc, quantity_dsc, units_dsc,
                         pmfile_dsc;
#else
   int ilen1, ilen2, ilen3;
#endif

#if defined(vms) || defined(__vms)
   PmInitStringDescriptor(&title_dsc);
   PmSetStringDescriptorConst(&title_dsc,title);
   PmInitStringDescriptor(&quantity_dsc);
   PmSetStringDescriptorConst(&quantity_dsc,quantity);
   PmInitStringDescriptor(&units_dsc);
   PmSetStringDescriptorConst(&units_dsc,units);
   PmInitStringDescriptor(&pmfile_dsc);
   PmSetStringDescriptorVar(&pmfile_dsc,pmfile_buffer,pmfile,PM_MAXPATHLEN);
   pmcont(data2d, posx, posy, &iposy, &iposx, &iposy, &iposx,
          &title_dsc, &quantity_dsc, &units_dsc,
          &llinear, &ilu, &linter, &pmfile_dsc);
#else
   ilen1 = strlen(title);
   ilen2 = strlen(quantity);
   ilen3 = strlen(units);
   memset(pmfile_buffer,' ',PM_MAXPATHLEN);
   memcpy(pmfile_buffer,pmfile,MIN(strlen(pmfile),PM_MAXPATHLEN));
   pmcont(data2d, posx, posy, &iposy, &iposx, &iposy, &iposx,
          title, quantity, units,
          &llinear, &ilu, &linter, pmfile_buffer,
          ilen1, ilen2, ilen3, PM_MAXPATHLEN);
#endif

   /* Null terminate string, remember, array is zero based */
   for(i=PM_MAXPATHLEN-2; i>0; i-- ) {
      if( pmfile_buffer[i] != ' ' ) {
         pmfile_buffer[i+1] = '\0';
         break;
      }
   }
   return(pmfile_buffer);

}


#if defined(vms) || defined(__vms)
void PmInitStringDescriptor(struct dsc$descriptor *string)
{
   string->dsc$w_length = 0;
   string->dsc$a_pointer = NULL;
   string->dsc$b_dtype = DSC$K_DTYPE_T;
   string->dsc$b_class = DSC$K_CLASS_S;
}

void PmSetStringDescriptorConst(struct dsc$descriptor *desc,
                                char                  *string)
{
      desc->dsc$a_pointer = string;
      desc->dsc$w_length  = strlen(string);
}

void PmSetStringDescriptorVar(struct dsc$descriptor *desc,
                              char                  *string,
                              char                  *init,
                              int                   len)
{
      int ilen;

      desc->dsc$a_pointer = string;
      desc->dsc$w_length  = len;

      memset(string,' ',len);
      ilen = strlen(init);
      memcpy(string,init,MIN(ilen,len));
}

void PmInitStringArrayDescriptor(struct dsc$descriptor_a *cchar)
{
      /* Initialize string array descriptor */
      cchar->dsc$w_length = 0;
      cchar->dsc$b_dtype  = DSC$K_DTYPE_T;
      cchar->dsc$b_class  = DSC$K_CLASS_A;
      cchar->dsc$a_pointer = NULL;
      cchar->dsc$b_scale   = 0;
      cchar->dsc$b_digits  = 0;
      cchar->dsc$b_aflags.dsc$v_fl_binscale  = 0;
      cchar->dsc$b_aflags.dsc$v_fl_redim   = 0;
      cchar->dsc$b_aflags.dsc$v_fl_column  = 0;
      cchar->dsc$b_aflags.dsc$v_fl_coeff   = 0;
      cchar->dsc$b_aflags.dsc$v_fl_bounds  = 0;
      cchar->dsc$b_dimct = 1;
      cchar->dsc$l_arsize = 0;
}

void PmSetStringArrayDescriptor(struct dsc$descriptor_a *cchar,
                                char                    *data,
                                int                      num,
                                int                      size)
{
      /* Define array of character strings, num entries of length size */
      cchar->dsc$w_length = size;
      cchar->dsc$a_pointer = data;
      cchar->dsc$l_arsize = num*size;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -