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

📄 cptc_geomsh_utils.c

📁 算断裂的
💻 C
字号:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <types.h>
#include <xdr.h>
#include "GeoFmt.h"
#include "MshFmt2.h"
#ifndef _WIN32
#include <unistd.h>
#endif

#define cptc_malloc malloc

/* define memory allocation symbols */

#define CPTC_HEADER_SIZE (256)

/* --------------------------------------------------------------------
** xdr_int_vector: encode/decode a vector of ints of specified length
**
** Arguments:
**    xdrs   - XDR stream handle
**    ap     - pointer to vector of ints (int **)
**    num_elements - number of elements in vector
**
** --------------------------------------------------------------------
*/

bool_t xdr_int_vector(XDR* xdrs, int** ap, int num_elements)
{
  int i, *a;

  if (num_elements <= 0) {
    if (xdrs -> x_op == XDR_DECODE)
    *ap = 0;
    return (TRUE);
  }
  if (xdrs->x_op == XDR_DECODE) {
    a = (int *)cptc_malloc(num_elements*sizeof(int));
  }
  else {
    a = *ap;
  }

  for (i = 0; i < num_elements; i++) {
    if (!xdr_int(xdrs, &a[i])) {
      return (FALSE);
    }
  }
  
  if (xdrs->x_op == XDR_DECODE) {
    *ap = a; 
  }

  return (TRUE);
}


/* -------------------------------------------------------------
** generate_Cptc_header: generate the standard file header and 
**    store in a 256-byte character array (no null termination)
**
** Arguments:
**    header - (char *) to hold header information
**    type   - 4 byte file type code
**    prefix - file name prefix (problem name)
**
** Header format:
**       bytes     value
**      0 -   3  Bit pattern to check byte ordering "abcd"
**      4 -   7  4 character file type code
**      8 -  71  file name prefix (up to 64 characters, space padded)
**     72 -  91  creation date and time, mmm dd hh:mm:ss yyyy
**     91 - 254  currently unused
**    255 - 255  '\n'
*/

/* -------------------------------------------------------------------- */

int generate_Cptc_header(char *header, char *type, char *prefix)
{
  int     i, len ;
  time_t  time_s ;
  char    *time_string ;
  char    buff[CPTC_HEADER_SIZE];

  /* check bit pattern */
  buff[0] = 'a' ;
  buff[1] = 'b' ;
  buff[2] = 'c' ;
  buff[3] = 'd' ;

  /* type code */

  len = strlen(type) ;
  if (len > 4 ) len = 4 ;
  for (i=0 ; i<len ; i++) buff[i+4] = type[i] ;
  for (i=len ; i<4 ; i++) buff[i+4] = ' ' ;

  /* file name prefix */

  len = strlen(prefix) ;
  if (len > 64 ) len = 64 ;
  for (i=0 ; i<len ; i++) buff[i+8] = prefix[i] ;
  for (i=len ; i<64 ; i++) buff[i+8] = ' ' ;

  /* the creation data */

  time(&time_s) ;
  time_string = ctime(&time_s) ;
  for (i=4 ; i<24 ; i++) buff[i+68] = time_string[i] ;
    
  /* fill */
    
  for (i=92 ; i<252 ; i++) buff[i] = '-' ;
  buff[252] = '\0' ;
    
  strcpy(header, buff);
  return 0;
}

/* --------------------------------------------------------------------
** xdr_Cptc_header - encode/decode a standard header buffer to 
**    an XDR formatted file
**
** Arguments:
**    xdrs - XDR stream handle
**    header_p - pointer to character array
**
** --------------------------------------------------------------------
*/

bool_t xdr_Cptc_header(XDR *xdrs, char **header_p)
{
  char *header;

  if (xdrs->x_op == XDR_DECODE) {
    header = (char *) cptc_malloc ((CPTC_HEADER_SIZE+1) * sizeof(char));
  }
  else {
    header = *header_p;
  }

  if (!xdr_string(xdrs, &header, CPTC_HEADER_SIZE)) return (FALSE);

  if (xdrs->x_op == XDR_DECODE) {
    *header_p = header;
  }

  return (TRUE);
}

/* --------------------------------------------------------------------
** cptc_xdr_write_header - generate the standard file header, and write
**    the contents to an XDR formatted file
**
** Arguments:
**    xdrs - XDR stream handle
**    type   - 4 byte file type code
**    prefix - file name prefix (problem name)
**
** --------------------------------------------------------------------
*/

bool_t cptc_xdr_write_header(XDR *xdrs, char *type, char *prefix)
{
  char *header = (char *) cptc_malloc (256 * sizeof(char));
  generate_Cptc_header(header, type, prefix);

  if (xdrs->x_op != XDR_ENCODE) {
    fprintf(stderr, 
    "Error: cptc_write_xdr_header only valid for XDR_ENCODE streams.\n");
    exit(-1);
  }

  if (!xdr_Cptc_header(xdrs, &header)) return (FALSE);
  free(header);

  return (TRUE);
}


/* --------------------------------------------------------------------
** cptc_xdr_read_and_ignore_header - read the standard file header to an
**    XDR formatted file, and ignore the contents.
**
** Arguments:
**    xdrs - XDR stream handle
**
** --------------------------------------------------------------------
*/

bool_t cptc_xdr_read_and_ignore_header(XDR *xdrs)
{
  char *header;

  if (xdrs->x_op == XDR_DECODE) {
    header = (char *) cptc_malloc (CPTC_HEADER_SIZE * sizeof(char));
  }
  else {
    fprintf(stderr, 
    "Error: cptc_xdr_read_and_ignore_header only valid for XDR_DECODE streams.\n");
    exit(-1);
  }

  if (!xdr_Cptc_header(xdrs, &header)) return (FALSE);
  free(header);

  return (TRUE);
}

#ifndef _WIN32
char *cptc_geo_id(Cptc_GeomDesc* geom)
{
  unsigned long hostid;   
  unsigned long pid;
  time_t current_time;
  unsigned long memaddr;
  char *buf;

  hostid = gethostid();
  pid = getpid();
  current_time = time(0);
  memaddr = (unsigned long) geom;

  buf = (char *) malloc(255 * sizeof(char));
  sprintf(buf, "%u%u%u%u\0", hostid, pid, current_time, memaddr);
  return (buf);
}
#endif

void free_prop_or_val(int count, char **array) 
{
  int i;
  if (array == 0) return;
  for (i = 0; i < count; ++i)
    free(array[i]);
  free(array);
}

⌨️ 快捷键说明

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