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

📄 write.c

📁 gcc-fortran,linux使用fortran的编译软件。很好用的。
💻 C
📖 第 1 页 / 共 3 页
字号:
  p = write_block (dtp, 1);  if (p == NULL)    return 1;  *p = c;  return 0;}/* Write a list-directed logical value.  */static voidwrite_logical (st_parameter_dt *dtp, const char *source, int length){  write_char (dtp, extract_int (source, length) ? 'T' : 'F');}/* Write a list-directed integer value.  */static voidwrite_integer (st_parameter_dt *dtp, const char *source, int length){  char *p;  const char *q;  int digits;  int width;  char itoa_buf[GFC_ITOA_BUF_SIZE];  q = gfc_itoa (extract_int (source, length), itoa_buf, sizeof (itoa_buf));  switch (length)    {    case 1:      width = 4;      break;    case 2:      width = 6;      break;    case 4:      width = 11;      break;    case 8:      width = 20;      break;    default:      width = 0;      break;    }  digits = strlen (q);  if (width < digits)    width = digits;  p = write_block (dtp, width);  if (p == NULL)    return;  if (dtp->u.p.no_leading_blank)    {      memcpy (p, q, digits);      memset (p + digits, ' ', width - digits);    }  else    {      memset (p, ' ', width - digits);      memcpy (p + width - digits, q, digits);    }}/* Write a list-directed string.  We have to worry about delimiting   the strings if the file has been opened in that mode.  */static voidwrite_character (st_parameter_dt *dtp, const char *source, int length){  int i, extra;  char *p, d;  switch (dtp->u.p.current_unit->flags.delim)    {    case DELIM_APOSTROPHE:      d = '\'';      break;    case DELIM_QUOTE:      d = '"';      break;    default:      d = ' ';      break;    }  if (d == ' ')    extra = 0;  else    {      extra = 2;      for (i = 0; i < length; i++)	if (source[i] == d)	  extra++;    }  p = write_block (dtp, length + extra);  if (p == NULL)    return;  if (d == ' ')    memcpy (p, source, length);  else    {      *p++ = d;      for (i = 0; i < length; i++)	{	  *p++ = source[i];	  if (source[i] == d)	    *p++ = d;	}      *p = d;    }}/* Output a real number with default format.   This is 1PG14.7E2 for REAL(4), 1PG23.15E3 for REAL(8),   1PG24.15E4 for REAL(10) and 1PG40.31E4 for REAL(16).  */static voidwrite_real (st_parameter_dt *dtp, const char *source, int length){  fnode f ;  int org_scale = dtp->u.p.scale_factor;  f.format = FMT_G;  dtp->u.p.scale_factor = 1;  switch (length)    {    case 4:      f.u.real.w = 14;      f.u.real.d = 7;      f.u.real.e = 2;      break;    case 8:      f.u.real.w = 23;      f.u.real.d = 15;      f.u.real.e = 3;      break;    case 10:      f.u.real.w = 28;      f.u.real.d = 19;      f.u.real.e = 4;      break;    case 16:      f.u.real.w = 40;      f.u.real.d = 31;      f.u.real.e = 4;      break;    default:      internal_error (&dtp->common, "bad real kind");      break;    }  write_float (dtp, &f, source , length);  dtp->u.p.scale_factor = org_scale;}static voidwrite_complex (st_parameter_dt *dtp, const char *source, int kind, size_t size){  if (write_char (dtp, '('))    return;  write_real (dtp, source, kind);  if (write_char (dtp, ','))    return;  write_real (dtp, source + size / 2, kind);  write_char (dtp, ')');}/* Write the separator between items.  */static voidwrite_separator (st_parameter_dt *dtp){  char *p;  p = write_block (dtp, options.separator_len);  if (p == NULL)    return;  memcpy (p, options.separator, options.separator_len);}/* Write an item with list formatting.   TODO: handle skipping to the next record correctly, particularly   with strings.  */static voidlist_formatted_write_scalar (st_parameter_dt *dtp, bt type, void *p, int kind,			     size_t size){  if (dtp->u.p.current_unit == NULL)    return;  if (dtp->u.p.first_item)    {      dtp->u.p.first_item = 0;      write_char (dtp, ' ');    }  else    {      if (type != BT_CHARACTER || !dtp->u.p.char_flag ||	  dtp->u.p.current_unit->flags.delim != DELIM_NONE)	write_separator (dtp);    }  switch (type)    {    case BT_INTEGER:      write_integer (dtp, p, kind);      break;    case BT_LOGICAL:      write_logical (dtp, p, kind);      break;    case BT_CHARACTER:      write_character (dtp, p, kind);      break;    case BT_REAL:      write_real (dtp, p, kind);      break;    case BT_COMPLEX:      write_complex (dtp, p, kind, size);      break;    default:      internal_error (&dtp->common, "list_formatted_write(): Bad type");    }  dtp->u.p.char_flag = (type == BT_CHARACTER);}voidlist_formatted_write (st_parameter_dt *dtp, bt type, void *p, int kind,		      size_t size, size_t nelems){  size_t elem;  char *tmp;  tmp = (char *) p;  /* Big loop over all the elements.  */  for (elem = 0; elem < nelems; elem++)    {      dtp->u.p.item_count++;      list_formatted_write_scalar (dtp, type, tmp + size*elem, kind, size);    }}/*			NAMELIST OUTPUT   nml_write_obj writes a namelist object to the output stream.  It is called   recursively for derived type components:	obj    = is the namelist_info for the current object.	offset = the offset relative to the address held by the object for		 derived type arrays.	base   = is the namelist_info of the derived type, when obj is a		 component.	base_name = the full name for a derived type, including qualifiers		    if any.   The returned value is a pointer to the object beyond the last one   accessed, including nested derived types.  Notice that the namelist is   a linear linked list of objects, including derived types and their   components.  A tree, of sorts, is implied by the compound names of   the derived type components and this is how this function recurses through   the list.  *//* A generous estimate of the number of characters needed to print   repeat counts and indices, including commas, asterices and brackets.  */#define NML_DIGITS 20static namelist_info *nml_write_obj (st_parameter_dt *dtp, namelist_info * obj, index_type offset,	       namelist_info * base, char * base_name){  int rep_ctr;  int num;  int nml_carry;  index_type len;  index_type obj_size;  index_type nelem;  index_type dim_i;  index_type clen;  index_type elem_ctr;  index_type obj_name_len;  void * p ;  char cup;  char * obj_name;  char * ext_name;  char rep_buff[NML_DIGITS];  namelist_info * cmp;  namelist_info * retval = obj->next;  /* Write namelist variable names in upper case. If a derived type,     nothing is output.  If a component, base and base_name are set.  */  if (obj->type != GFC_DTYPE_DERIVED)    {#ifdef HAVE_CRLF      write_character (dtp, "\r\n ", 3);#else      write_character (dtp, "\n ", 2);#endif      len = 0;      if (base)	{	  len =strlen (base->var_name);	  for (dim_i = 0; dim_i < (index_type) strlen (base_name); dim_i++)            {	      cup = toupper (base_name[dim_i]);	      write_character (dtp, &cup, 1);            }	}      for (dim_i =len; dim_i < (index_type) strlen (obj->var_name); dim_i++)	{	  cup = toupper (obj->var_name[dim_i]);	  write_character (dtp, &cup, 1);	}      write_character (dtp, "=", 1);    }  /* Counts the number of data output on a line, including names.  */  num = 1;  len = obj->len;  switch (obj->type)    {    case GFC_DTYPE_REAL:      obj_size = size_from_real_kind (len);      break;    case GFC_DTYPE_COMPLEX:      obj_size = size_from_complex_kind (len);      break;    case GFC_DTYPE_CHARACTER:      obj_size = obj->string_length;      break;    default:      obj_size = len;          }  if (obj->var_rank)    obj_size = obj->size;  /* Set the index vector and count the number of elements.  */  nelem = 1;  for (dim_i=0; dim_i < obj->var_rank; dim_i++)    {      obj->ls[dim_i].idx = obj->dim[dim_i].lbound;      nelem = nelem * (obj->dim[dim_i].ubound + 1 - obj->dim[dim_i].lbound);    }  /* Main loop to output the data held in the object.  */  rep_ctr = 1;  for (elem_ctr = 0; elem_ctr < nelem; elem_ctr++)    {      /* Build the pointer to the data value.  The offset is passed by	 recursive calls to this function for arrays of derived types.	 Is NULL otherwise.  */      p = (void *)(obj->mem_pos + elem_ctr * obj_size);      p += offset;      /* Check for repeat counts of intrinsic types.  */      if ((elem_ctr < (nelem - 1)) &&	  (obj->type != GFC_DTYPE_DERIVED) &&	  !memcmp (p, (void*)(p + obj_size ), obj_size ))	{	  rep_ctr++;	}      /* Execute a repeated output.  Note the flag no_leading_blank that	 is used in the functions used to output the intrinsic types.  */      else	{	  if (rep_ctr > 1)	    {	      st_sprintf(rep_buff, " %d*", rep_ctr);	      write_character (dtp, rep_buff, strlen (rep_buff));	      dtp->u.p.no_leading_blank = 1;	    }	  num++;	  /* Output the data, if an intrinsic type, or recurse into this	     routine to treat derived types.  */	  switch (obj->type)	    {	    case GFC_DTYPE_INTEGER:	      write_integer (dtp, p, len);              break;	    case GFC_DTYPE_LOGICAL:	      write_logical (dtp, p, len);              break;	    case GFC_DTYPE_CHARACTER:	      if (dtp->u.p.nml_delim)		write_character (dtp, &dtp->u.p.nml_delim, 1);	      write_character (dtp, p, obj->string_length);	      if (dtp->u.p.nml_delim)		write_character (dtp, &dtp->u.p.nml_delim, 1);              break;	    case GFC_DTYPE_REAL:	      write_real (dtp, p, len);              break;	    case GFC_DTYPE_COMPLEX:	      dtp->u.p.no_leading_blank = 0;	      num++;              write_complex (dtp, p, len, obj_size);              break;	    case GFC_DTYPE_DERIVED:	      /* To treat a derived type, we need to build two strings:		 ext_name = the name, including qualifiers that prepends			    component names in the output - passed to			    nml_write_obj.		 obj_name = the derived type name with no qualifiers but %			    appended.  This is used to identify the			    components.  */	      /* First ext_name => get length of all possible components  */	      ext_name = (char*)get_mem ( (base_name ? strlen (base_name) : 0)					+ (base ? strlen (base->var_name) : 0)					+ strlen (obj->var_name)					+ obj->var_rank * NML_DIGITS					+ 1);	      strcpy(ext_name, base_name ? base_name : "");	      clen = base ? strlen (base->var_name) : 0;	      strcat (ext_name, obj->var_name + clen);	      /* Append the qualifier.  */	      for (dim_i = 0; dim_i < obj->var_rank; dim_i++)		{		  strcat (ext_name, dim_i ? "" : "(");		  clen = strlen (ext_name);		  st_sprintf (ext_name + clen, "%d", (int) obj->ls[dim_i].idx);		  strcat (ext_name, (dim_i == obj->var_rank - 1) ? ")" : ",");		}	      /* Now obj_name.  */	      obj_name_len = strlen (obj->var_name) + 1;	      obj_name = get_mem (obj_name_len+1);	      strcpy (obj_name, obj->var_name);	      strcat (obj_name, "%");	      /* Now loop over the components. Update the component pointer		 with the return value from nml_write_obj => this loop jumps		 past nested derived types.  */	      for (cmp = obj->next;		   cmp && !strncmp (cmp->var_name, obj_name, obj_name_len);		   cmp = retval)		{		  retval = nml_write_obj (dtp, cmp,					  (index_type)(p - obj->mem_pos),					  obj, ext_name);		}	      free_mem (obj_name);	      free_mem (ext_name);	      goto obj_loop;            default:	      internal_error (&dtp->common, "Bad type for namelist write");            }	  /* Reset the leading blank suppression, write a comma and, if 5	     values have been output, write a newline and advance to column	     2. Reset the repeat counter.  */	  dtp->u.p.no_leading_blank = 0;	  write_character (dtp, ",", 1);	  if (num > 5)	    {	      num = 0;#ifdef HAVE_CRLF	      write_character (dtp, "\r\n ", 3);#else	      write_character (dtp, "\n ", 2);#endif	    }	  rep_ctr = 1;	}    /* Cycle through and increment the index vector.  */obj_loop:    nml_carry = 1;    for (dim_i = 0; nml_carry && (dim_i < obj->var_rank); dim_i++)      {	obj->ls[dim_i].idx += nml_carry ;	nml_carry = 0;	if (obj->ls[dim_i].idx  > (ssize_t)obj->dim[dim_i].ubound)	  {	    obj->ls[dim_i].idx = obj->dim[dim_i].lbound;	    nml_carry = 1;	  }       }    }  /* Return a pointer beyond the furthest object accessed.  */  return retval;}/* This is the entry function for namelist writes.  It outputs the name   of the namelist and iterates through the namelist by calls to   nml_write_obj.  The call below has dummys in the arguments used in   the treatment of derived types.  */voidnamelist_write (st_parameter_dt *dtp){  namelist_info * t1, *t2, *dummy = NULL;  index_type i;  index_type dummy_offset = 0;  char c;  char * dummy_name = NULL;  unit_delim tmp_delim;  /* Set the delimiter for namelist output.  */  tmp_delim = dtp->u.p.current_unit->flags.delim;  dtp->u.p.current_unit->flags.delim = DELIM_NONE;  switch (tmp_delim)    {    case (DELIM_QUOTE):      dtp->u.p.nml_delim = '"';      break;    case (DELIM_APOSTROPHE):      dtp->u.p.nml_delim = '\'';      break;    default:      dtp->u.p.nml_delim = '\0';      break;    }  write_character (dtp, "&", 1);  /* Write namelist name in upper case - f95 std.  */  for (i = 0 ;i < dtp->namelist_name_len ;i++ )    {      c = toupper (dtp->namelist_name[i]);      write_character (dtp, &c ,1);    }  if (dtp->u.p.ionml != NULL)    {      t1 = dtp->u.p.ionml;      while (t1 != NULL)	{	  t2 = t1;	  t1 = nml_write_obj (dtp, t2, dummy_offset, dummy, dummy_name);	}    }#ifdef HAVE_CRLF  write_character (dtp, "  /\r\n", 5);#else  write_character (dtp, "  /\n", 4);#endif  /* Recover the original delimiter.  */  dtp->u.p.current_unit->flags.delim = tmp_delim;}#undef NML_DIGITS

⌨️ 快捷键说明

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