コード例 #1
0
ファイル: fileio.c プロジェクト: barak/lush
const char *cwd(const char *s)
{
#ifdef UNIX
   if (s) {
      errno = 0;
      if (chdir(s)==-1)
         test_file_error(NULL, errno);
   }
#  ifdef HAVE_GETCWD
   assert(getcwd(string_buffer,STRING_BUFFER));
   return mm_strdup(string_buffer);
#  else
   assert(getwd(string_buffer));
   return mm_strdup(string_buffer);
#  endif
#endif
#ifdef WIN32
   char drv[2];
   if (s)
      errno = 0;
      if (_chdir(s)==-1)
         test_file_error(NULL, errno);
   drv[0]='.'; drv[1]=0;
   GetFullPathName(drv, STRING_BUFFER, string_buffer, &s);
   return mm_strdup(string_buffer);
#endif
}
コード例 #2
0
ファイル: oostruct.c プロジェクト: barak/lush
static const char *generic_name(at *p)
{
   if (Class(p)->classname)
      sprintf(string_buffer, "::%s:%p", NAMEOF(Class(p)->classname),Mptr(p));
   else
      sprintf(string_buffer, "::%p:%p", Class(p), Mptr(p));
   
   return mm_strdup(string_buffer);
}
コード例 #3
0
ファイル: mmio.cpp プロジェクト: DaniCF93/studia
char  *mm_typecode_to_str(MM_typecode matcode)
{
    char buffer[MM_MAX_LINE_LENGTH];
    char *types[4];
	char *mm_strdup(const char *);
    int error =0;

    /* check for MTX type */
    if (mm_is_matrix(matcode)) 
        types[0] = MM_MTX_STR;
    else
        error=1;

    /* check for CRD or ARR matrix */
    if (mm_is_sparse(matcode))
        types[1] = MM_SPARSE_STR;
    else
    if (mm_is_dense(matcode))
        types[1] = MM_DENSE_STR;
    else
        return NULL;

    /* check for element data type */
    if (mm_is_real(matcode))
        types[2] = MM_REAL_STR;
    else
    if (mm_is_complex(matcode))
        types[2] = MM_COMPLEX_STR;
    else
    if (mm_is_pattern(matcode))
        types[2] = MM_PATTERN_STR;
    else
    if (mm_is_integer(matcode))
        types[2] = MM_INT_STR;
    else
        return NULL;


    /* check for symmetry type */
    if (mm_is_general(matcode))
        types[3] = MM_GENERAL_STR;
    else
    if (mm_is_symmetric(matcode))
        types[3] = MM_SYMM_STR;
    else 
    if (mm_is_hermitian(matcode))
        types[3] = MM_HERM_STR;
    else 
    if (mm_is_skew(matcode))
        types[3] = MM_SKEW_STR;
    else
        return NULL;

    sprintf(buffer,"%s %s %s %s", types[0], types[1], types[2], types[3]);
    return mm_strdup(buffer);

}
コード例 #4
0
ファイル: oostruct.c プロジェクト: barak/lush
static const char *class_name(at *p)
{
   class_t *cl = Mptr(p);
   
   if (cl->classname)
      sprintf(string_buffer, "::class:%s", NAMEOF(cl->classname));
   else
      sprintf(string_buffer, "::class:%p", cl);
   
   if (!cl->live)
      strcat(string_buffer, " (unlinked)");

   return mm_strdup(string_buffer);
}
コード例 #5
0
ファイル: storage.c プロジェクト: barak/lush
static const char *storage_name(at *p)
{
   storage_t *st = (storage_t *)Mptr(p);
   char *kind = "";
   switch (st->kind) {
   case STS_NULL:    kind = "unallocated"; break;
   case STS_MANAGED: kind = "managed"; break;
   case STS_FOREIGN: kind = "foreign"; break;
   case STS_MMAP:    kind = "mmap"; break;
   case STS_STATIC:  kind = "static"; break;
   default:
      fprintf(stderr, "internal error: invalid storage kind");
      abort();
   }
   const char *clname = nameof(Symbol(Class(p)->classname));
   sprintf(string_buffer, "::%s:%s@%p:<%"PRIdPTR">", clname, kind, st->data, st->size);
   return mm_strdup(string_buffer);
}
コード例 #6
0
ファイル: stdio.c プロジェクト: mmaul/lush2
/*
 * FUNCTION fgets
 */
extern_c char* C_fgets(FILE * L1_fp,int L1_maxsize)
{
TRACE_PUSH("C_fgets"); MM_ENTER;
{
char* L_Tmp0;
{
char* L2_1_result;
char *L2_0_str;
Mstr_alloc(L2_0_str, 0+1);
strcpy((char*)(L2_0_str),"");
L2_1_result = L2_0_str;
{
      char buffer[(L1_maxsize)];
      fgets(buffer,(L1_maxsize),(L1_fp));
      (L2_1_result) = mm_strdup(buffer);
    }
L_Tmp0 = L2_1_result;
}
TRACE_POP("C_fgets");
MM_EXIT; return L_Tmp0;
}
}
コード例 #7
0
ファイル: stdio.c プロジェクト: mmaul/lush2
/*
 * FUNCTION fscan-str
 */
extern_c char* C_fscan_str(FILE * L1_fp)
{
TRACE_PUSH("C_fscan_str"); MM_ENTER;
{
char* L_Tmp0;
{
char* L2_1_result;
char *L2_0_str;
Mstr_alloc(L2_0_str, 0+1);
strcpy((char*)(L2_0_str),"");
L2_1_result = L2_0_str;
{
      char buffer[1024];
      int s = fscanf((L1_fp),"%s",buffer);
      if (s < 1) { buffer[0]=0; }
      (L2_1_result) = mm_strdup(buffer);
    }
L_Tmp0 = L2_1_result;
}
TRACE_POP("C_fscan_str");
MM_EXIT; return L_Tmp0;
}
}
コード例 #8
0
ファイル: client.cpp プロジェクト: dungeonsnd/test-code
static char * evdns_get_default_hosts_filename(void)
{
#ifdef WIN32
	/* Windows is a little coy about where it puts its configuration
	 * files.  Sure, they're _usually_ in C:\windows\system32, but
	 * there's no reason in principle they couldn't be in
	 * W:\hoboken chicken emergency\
	 */
	char path[MAX_PATH+1];
	static const char hostfile[] = "\\drivers\\etc\\hosts";
	char *path_out;
	size_t len_out;

	if (! SHGetSpecialFolderPathA(NULL, path, CSIDL_SYSTEM, 0))
		return NULL;
	len_out = strlen(path)+strlen(hostfile);
	path_out = (char *)malloc(len_out+1);
	evutil_snprintf(path_out, len_out+1, "%s%s", path, hostfile);
	return path_out;
#else
	return mm_strdup("/etc/hosts");
#endif
}
コード例 #9
0
ファイル: mm_global.c プロジェクト: dawnbreaks/arch
char *MM_strdup(const char *str)
{
    if (mm_global == NULL)
        return NULL;
    return mm_strdup(mm_global, str);
}
コード例 #10
0
ファイル: fileio.c プロジェクト: barak/lush
/* lush_basename returns a new, managed string */
const char *lush_basename(const char *fname, const char *suffix)
{
#ifdef UNIX
   if (strlen(fname) > STRING_BUFFER-4)
      RAISEF("filename is too long",NIL);
   char *s = strrchr(fname,'/');
   if (s)
      fname = s+1;
   /* Process suffix */
   if (suffix==0 || suffix[0]==0)
      return mm_strdup(fname);
   if (suffix[0]=='.')
      suffix += 1;
   if (suffix[0]==0)
      return mm_strdup(fname);
   strcpyif(string_buffer,fname);
   int sl = strlen(suffix);
   s = string_buffer + strlen(string_buffer);
   if (s > string_buffer + sl) {
      s =  s - (sl + 1);
      if (s[0]=='.' && strcmp(s+1,suffix)==0)
         *s = 0;
   }
   return mm_strdup(string_buffer);
#endif
  
#ifdef WIN32
   const char *p = fname;
   const char *s = fname;
   /* Special cases */
   if (fname[0] && fname[1]==':') {
      strcpyif(string_buffer,fname);
      if (fname[2]==0)
         return mm_strdup(string_buffer);
      string_buffer[2] = '\\'; 
      if (fname[3]==0 && (fname[2]=='/' || fname[2]=='\\'))
         return mm_strdup(string_buffer);
   }
   /* Position p after last slash */
   while (*s) {
      if (s[0]=='\\' || s[0]=='/')
         p = s + 1;
      s++;
   }
   /* Copy into buffer */
   if (strlen(p) > STRING_BUFFER-10)
      RAISEF("filename too long",NIL);
   s = string_buffer;
   while (*p && *p!='/' && *p!='\\')
      *s++ = *p++;
   *s = 0;
   /* Process suffix */
   if (suffix==0 || suffix[0]==0)
      return mm_strdup(string_buffer);
   if (suffix[0]=='.')
      suffix += 1;
   if (suffix[0]==0)
      return mm_strdup(string_buffer);    
   int sl = strlen(suffix);
   if (s > string_buffer + sl) {
      s = s - (sl + 1);
      if (s[0]=='.' && stricmp(s+1,suffix)==0)
         *s = 0;
   }
   return mm_strdup(string_buffer);
#endif
}
コード例 #11
0
ファイル: fileio.c プロジェクト: barak/lush
/* expects a managed string & returns a managed string */
const char *lush_dirname(const char *fname)
{
#ifdef UNIX
   const char *s = fname;
   const char *p = 0;
   char *q = string_buffer;
   while (*s) {
      if (s[0]=='/' && s[1])
         p = s;
      s++;
   }
   if (!p) {
      if (fname[0]=='/')
         return fname;
      else
         return mm_strdup(".");
   }
   s = fname;
   if (p-s > STRING_BUFFER-1)
      RAISEF("filename is too long",NIL);
   do {
      *q++ = *s++;
   } while (s<p);
   *q = 0;
   return mm_strdup(string_buffer);
#endif

#ifdef WIN32
   char *s, *p;
   char *q = string_buffer;
   /* Handle leading drive specifier */
   if (fname[0] && fname[1]==':') {
      *q++ = *fname++;
      *q++ = *fname++;
   }
   /* Search last non terminal / or \ */
   p = 0;
   s = fname;
   while (*s) {
      if (s[0]=='\\' || s[0]=='/')
         if (s[1] && s[1]!='/' && s[1]!='\\')
            p = s;
      s++;
   }
   /* Cannot find non terminal / or \ */
   if (p == 0) {
      if (q>string_buffer) {
         if (fname[0]==0 || fname[0]=='/' || fname[0]=='\\')
            return mm_strdup("\\\\");
         *q = 0;
         return mm_strdup(string_buffer);
      } else {
         if (fname[0]=='/' || fname[0]=='\\')
            return mm_strdup("\\\\");
         else
            return mm_strdup(".");
      }
   }
   /* Single leading slash */
   if (p == fname) {
      strcpy(q,"\\");
      return string_buffer;
   }
   /* Backtrack all slashes */
   while (p>fname && (p[-1]=='/' || p[-1]=='\\'))
      p--;
   /* Multiple leading slashes */
   if (p == fname)
      return "\\\\";
   /* Regular case */
   s = fname;
   if (p-s > STRING_BUFFER-4)
      error(NIL,"filename is too long",NIL);
   do {
      *q++ = *s++;
   } while (s<p);
   *q = 0;
   return mm_strdup(string_buffer);
#endif
}
コード例 #12
0
int Trick::MemoryManager::assign_recursive(void* base_addr, ATTRIBUTES* attr, int curr_dim, int offset, V_TREE* v_tree, UCFn* cf) {

   char* assign_addr;
   int remaining_dimensions = attr->num_index - curr_dim;

   if ( remaining_dimensions == 0 ) {

      switch (attr->type) {

           case TRICK_CHARACTER :
           case TRICK_UNSIGNED_CHARACTER :
               assign_addr = (char*)base_addr + offset * sizeof(char);
               if (v_tree && v_tree->v_data) {
                   *(char*)assign_addr = vval_char(v_tree->v_data);
               } else {
                   *(char*)assign_addr = '\0';
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(char*)" << (void*)assign_addr
                             << " = ";
                   if (isprint(*(char*)assign_addr)) {
                       std::cout << *(char*)assign_addr;
                   } else {
                       std::cout << (int)*(char*)assign_addr;
                   }
                   std::cout << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_WCHAR :
               assign_addr = (char*)base_addr + offset * sizeof(wchar_t);
               if (v_tree && v_tree->v_data) {
                   *(wchar_t*)assign_addr = vval_char(v_tree->v_data);
               } else {
                   *(wchar_t*)assign_addr = 0;
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(wchar_t*)" << (void*)assign_addr
                             << " = " << *(wchar_t*)assign_addr << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_SHORT :
           case TRICK_UNSIGNED_SHORT :
               assign_addr = (char*)base_addr + offset * sizeof(short);
               if (v_tree && v_tree->v_data) {
                   *(short *)assign_addr = vval_short(v_tree->v_data);
               } else {
                   *(short *)assign_addr = 0;
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(short*)" << (void*)assign_addr
                             << " = " << *(short*)assign_addr << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_INTEGER :
           case TRICK_UNSIGNED_INTEGER :
               assign_addr = (char*)base_addr + offset * sizeof(int);
               if (v_tree && v_tree->v_data) {
                   int input_value;
                   input_value = vval_int(v_tree->v_data);
                   if (cf == NULL) {
                       *(int *)assign_addr = input_value;
                   } else {
                       *(int *)assign_addr = input_value * cf->C[1] + cf->C[0];
                   }
               } else {
                   *(int *)assign_addr = 0;
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(int*)" << (void*)assign_addr
                             << " = " << *(int*)assign_addr << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_BOOLEAN :
               assign_addr = (char*)base_addr + offset * sizeof(bool);
               if (v_tree && v_tree->v_data) {
                   *(bool *)assign_addr = (vval_short(v_tree->v_data)!=0);
               } else {
                   *(bool *)assign_addr = false;
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(bool*)" << (void*)assign_addr
                             << " = " << *(bool*)assign_addr << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_ENUMERATED : 
               if (v_tree && v_tree->v_data) {
                   if ((size_t)attr->size == sizeof(int)) {
                       assign_addr = (char*)base_addr + offset * sizeof(int);
                       *(int *)assign_addr = vval_int(v_tree->v_data);
                       if (debug_level) {
                           std::cout << std::endl << "Assignment (Enum): *(int*)" << (void*)assign_addr
                                     << " = " << *(int*)assign_addr << ";" << std::endl;
                           std::cout.flush();
                       }
                   } else if ((size_t)attr->size == sizeof(short)) {
                       assign_addr = (char*)base_addr + offset * sizeof(short);
                       *(short *)assign_addr = vval_short(v_tree->v_data);
                       if (debug_level) {
                           std::cout << std::endl << "Assignment (Enum): *(short*)" << (void*)assign_addr
                                     << " = " << *(short*)assign_addr << ";" << std::endl;
                           std::cout.flush();
                       }
                   } else {
                       std::stringstream message;
                       message << "Enumeration of size " << attr->size << " is not supported.";
                       emitError(message.str());
                   }
               } else {
                   emitError("v_tree data appears to be corrupted.");
               }
               break;
           case TRICK_LONG :
           case TRICK_UNSIGNED_LONG :
               assign_addr = (char*)base_addr + offset * sizeof(long);
               if (v_tree && v_tree->v_data) {
                   long input_value; 
                   input_value = vval_long(v_tree->v_data);
                   if (cf == NULL) {
                       *(long *)assign_addr = input_value;
                   } else {
                       *(long *)assign_addr = input_value * cf->C[1] + cf->C[0];
                   }
               } else {
                   *(long *)assign_addr = 0;
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(long*)" << (void*)assign_addr
                             << " = " << *(long*)assign_addr << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_FLOAT :
               assign_addr = (char*)base_addr + offset * sizeof(float);
               if (v_tree && v_tree->v_data) {
                   float input_value;
                   input_value = vval_float(v_tree->v_data);
                   if (cf == NULL) {  // There is no units conversion.
                       *(float *)assign_addr = input_value;
                   } else { // There is units conversion.
                       *(float *)assign_addr = input_value * cf->C[1] + cf->C[0];
                   }
               } else {
                   *(float *)assign_addr = 0;
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(float*)" << (void*)assign_addr
                             << " = " << *(float*)assign_addr << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_DOUBLE :
               assign_addr = (char*)base_addr + offset * sizeof(double);
               if (v_tree && v_tree->v_data) {
                   double input_value;
                   input_value = vval_double(v_tree->v_data);
                   if (cf == NULL) {
                       *(double *)assign_addr = input_value;
                   } else {
                       *(double *)assign_addr = input_value * cf->C[1] + cf->C[0];
                   }
               } else {
                   *(double *)assign_addr = 0;
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(double*)" << (void*)assign_addr
                             << " = " << *(double*)assign_addr << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_LONG_LONG :
           case TRICK_UNSIGNED_LONG_LONG :
               assign_addr = (char*)base_addr + offset * sizeof(long long);
               if (v_tree && v_tree->v_data) {
                   *(long long *)assign_addr = vval_longlong(v_tree->v_data);
               } else {
                   *(long long *)assign_addr = 0;
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(long long*)" << (void*)assign_addr
                             << " = " << *(long long*)assign_addr << ";" << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_BITFIELD :
           case TRICK_UNSIGNED_BITFIELD : {
                   int input_value; 
                   assign_addr = (char*)base_addr + offset * (size_t)attr->size;
                   if (v_tree && v_tree->v_data) {
                       input_value = vval_int(v_tree->v_data);
                   } else {
                       input_value = 0;
                   }
                   if (attr->size == sizeof(int)) {
                       *(unsigned int*)assign_addr = insert_bitfield_any(
                           *(unsigned int*)assign_addr, input_value, attr->size, attr->index[0].start, attr->index[0].size);
                   } else if (attr->size == sizeof(short)) {
                       *(unsigned short*)assign_addr = insert_bitfield_any(
                           *(unsigned short*)assign_addr, input_value, attr->size, attr->index[0].start, attr->index[0].size);
                   } else if (attr->size == sizeof(char)) {
                       *(unsigned char*)assign_addr = insert_bitfield_any(
                           *(unsigned char*)assign_addr, input_value, attr->size, attr->index[0].start, attr->index[0].size);
                   } else {
                       std::stringstream message;
                       message << "Unhandled bitfield struct size (" << attr->size << ") in bitfield assignment.";
                       emitError(message.str());
                   }
                   if (debug_level) {
                       std::cout << std::endl << "Assignment: "
                                 << "Within the " << attr->size << " byte struct at " << (void*)assign_addr
                                 << ", the bitfield ["<< attr->index[0].start << ".."
                                 << attr->index[0].start + attr->index[0].size - 1
                                 << "] = " << input_value << ";"
                                 << std::endl;
                       std::cout.flush();
                   }
               } break;
           case TRICK_FILE_PTR :
               if (debug_level) {
                   std::cout << std::endl << "Assignment: TRICK_FILE_PTR assignments not yet implemented."
                             << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_VOID_PTR :
               if (debug_level) {
                   std::cout << std::endl << "Assignment: TRICK_VOID_PTR assignments not yet implemented."
                             << std::endl;
                   std::cout.flush();
               }
               break;
           case TRICK_STRING :
               assign_addr = (char*)base_addr + offset * sizeof(char*);
               if (v_tree && v_tree->v_data) {
                   *(std::string*)assign_addr = vval_string(v_tree->v_data);
               } else {
                   *(std::string*)assign_addr = "";
               }
               if (debug_level) {
                   std::cout << std::endl << "Assignment: *(std::string)" << (void*)assign_addr
                             << " = \"" << *(std::string*)assign_addr << "\";" << std::endl;
                   std::cout.flush();
               }
               break;
           default:
               std::stringstream message;
               message << "Unhandled Type (" << attr->type << ") in assignment.";
               emitError(message.str());
               return (1);
               break;
      }

   } else if ( remaining_dimensions > 0 ) {

       int size_of_curr_dim;

       size_of_curr_dim = attr->index[curr_dim].size ;
       assign_addr = (char*)base_addr + offset * sizeof(void*);

       if ( size_of_curr_dim == 0) { // the remaining dimensions are pointer dimensions.
           if (v_tree && v_tree->v_data) {

               if ((remaining_dimensions == 1) && (v_tree->v_data->type == TRICK_STRING)) { 
                   *(char**)assign_addr = mm_strdup( vval_string(v_tree->v_data));
               } else {
                   *(void**)assign_addr = vval_voidp(v_tree->v_data);
               }

           } else {
               *(void**)assign_addr = 0;
           }

           if (debug_level) {
               std::cout << std::endl << "Assignment: *(void**)" << (void*)assign_addr
                         << " = " << *(void**)assign_addr << ";" << std::endl;
               std::cout.flush();
           }

       } else { // next dimension is fixed.

           if ((attr->type == TRICK_CHARACTER) &&
               (remaining_dimensions == 1) &&
               (v_tree) &&
               (v_tree->v_data)
              ) {

               if ((v_tree->v_data->type == TRICK_STRING) &&
                   (v_tree->v_data->value.cp != NULL)) {

                   int rhs_len = (int)strlen(v_tree->v_data->value.cp) + 1;
                   if (rhs_len <= size_of_curr_dim ) {
                       strcpy((char*)assign_addr, v_tree->v_data->value.cp);
                   } else {
                       emitError("Memory Manager: char array is too small for the attempted string assignment.");
                       return (1);
                   }
               } else {
                   *(char*)assign_addr = '\0';
               }
               
           } else if ( (attr->type == TRICK_WCHAR) &&
                       (remaining_dimensions == 1)) { 

               if ((v_tree) &&
                   (v_tree->v_data->type == TRICK_WSTRING) &&  
                   (v_tree->v_data->value.wcp != NULL)) {

                       int rhs_len = (int)wcslen(v_tree->v_data->value.wcp) + 1;
                       if (rhs_len <= size_of_curr_dim ) {
                           wcscpy((wchar_t*)assign_addr, v_tree->v_data->value.wcp);
                       } else {
                           std::stringstream message;
                           message << "wchar_t array at [" << (void*)assign_addr
                                   << "] is to small for the attempted string assignment." ;
                           emitError(message.str());
                           return (1);
                       }
               } else if ((v_tree) &&
                          (v_tree->v_data->type == TRICK_STRING) && 
                          (v_tree->v_data->value.cp != NULL)) {

                       int rhs_len = (int)ncs_to_wcs_len(v_tree->v_data->value.cp) + 1;
                       if (rhs_len <= size_of_curr_dim ) {
                           ncs_to_wcs( v_tree->v_data->value.cp, (wchar_t*)assign_addr, rhs_len);
                       } else {
                           std::stringstream message;
                           message << "wchar_t array at [" << (void*)assign_addr
                                   << "] is too small for the attempted string assignment." ;
                           emitError(message.str());
                           return (1);
                       }
               } else {
                   *(wchar_t*)assign_addr = (wchar_t) NULL;
               }
           
           } else {
               int ii;
               V_TREE* curr_vt_node;
               if (v_tree) {
                   curr_vt_node = v_tree->down;
               } else {
                   curr_vt_node =  NULL;
               }               

               for (ii=0; ii < size_of_curr_dim; ii++) {
                   int ret;
                   ret = assign_recursive (base_addr,
                                           attr,
                                           curr_dim+1,
                                           offset * size_of_curr_dim + ii,
                                           curr_vt_node,
                                           cf);

                   if (ret !=0) {
                       return(1);
                   }

                   if (curr_vt_node) {
                     curr_vt_node = curr_vt_node->next;
                   }
               }
           }
       }
   } else {
        emitError("This is bad. In assign_recursive(), remaining_dimensions is negative.");
        return (1);
   }
   return (0);
}
コード例 #13
0
int tag_value_parse(tag_t *tag, const char *val, tag_value_t *tval, char *buf,
                    tagvalue_cmp_t cmp)
{
	if (!val) return 1;
	if (!*val && tag->valuetype != VT_NONE && cmp == CMP_EQ) {
		tval->v_str = tag_value_null_marker;
		return 0;
	}
	switch (tag->valuetype) {
		case VT_WORD:
			tval->v_str = buf ? val : mm_strdup(val);
			return 0;
			break;
		case VT_STRING:
			tval->v_str = str_enc2str(val, buf);
			if (!tval->v_str) return 1;
			return 0;
			break;
		case VT_INT:
			if (!tv_parser_int64_t(val, &tval->val.v_int,
			                       &tval->fuzz.f_int, cmp)) {
				tval->v_str = 0;
				return 0;
			}
			break;
		case VT_UINT:
			if (!tv_parser_uint64_t(val, &tval->val.v_uint,
			                        &tval->fuzz.f_uint, cmp)) {
				tval->v_str = 0;
				return 0;
			}
			break;
		case VT_FLOAT:
		case VT_F_STOP:
		case VT_STOP:
			if (!tv_parser_double(val, &tval->val.v_double,
			                      &tval->fuzz.f_double, cmp)) {
				if (buf) {
					tval->v_str = val;
				} else {
					tval->v_str = mm_strdup(val);
				}
				if (tag->valuetype == VT_F_STOP) {
					scale_f_stop(tval);
				} else if (tag->valuetype == VT_STOP) {
					scale_stop(tval);
				}
				return 0;
			}
			break;
		case VT_DATETIME:
			if (!tv_parser_datetime(val, &tval->val.v_datetime,
			                        &tval->fuzz.f_datetime, cmp)) {
				if (buf) {
					tval->v_str = val;
				} else {
					tval->v_str = mm_strdup(val);
				}
				return 0;
			}
			break;
		case VT_GPS:
			if (!tv_parser_gps(val, &tval->val.v_gps,
			                   &tval->fuzz.f_gps)) {
				if (buf) {
					tval->v_str = val;
				} else {
					tval->v_str = mm_strdup(val);
				}
				return 0;
			}
			break;
		default: // VT_NONE, or bad value
			break;
	}
	return 1;
}
コード例 #14
0
ファイル: mm_io.cpp プロジェクト: Nikraaaazy/strads
char *mm_typecode_to_str ( MM_typecode matcode )
/******************************************************************************/
/*
  Purpose:
    MM_TYPECODE_TO_STR converts the internal typecode to an MM header string.
  Modified:
    31 October 2008
*/
{
    char buffer[MM_MAX_LINE_LENGTH];
    char *types[4];
	char *mm_strdup(const char *);
	//int error =0;
/* 
  check for MTX type 
*/
    if (mm_is_matrix(matcode)) 
      types[0] = MM_MTX_STR;
    //    else
    //    error=1;
/* 
  check for CRD or ARR matrix 
*/
    if (mm_is_sparse(matcode))
        types[1] = MM_SPARSE_STR;
    else
    if (mm_is_dense(matcode))
        types[1] = MM_DENSE_STR;
    else
        return NULL;
/* 
  check for element data type 
*/
    if (mm_is_real(matcode))
        types[2] = MM_REAL_STR;
    else
    if (mm_is_complex(matcode))
        types[2] = MM_COMPLEX_STR;
    else
    if (mm_is_pattern(matcode))
        types[2] = MM_PATTERN_STR;
    else
    if (mm_is_integer(matcode))
        types[2] = MM_INT_STR;
    else
        return NULL;
/* 
  check for symmetry type 
*/
    if (mm_is_general(matcode))
        types[3] = MM_GENERAL_STR;
    else
    if (mm_is_symmetric(matcode))
        types[3] = MM_SYMM_STR;
    else 
    if (mm_is_hermitian(matcode))
        types[3] = MM_HERM_STR;
    else 
    if (mm_is_skew(matcode))
        types[3] = MM_SKEW_STR;
    else
        return NULL;
    sprintf(buffer,"%s %s %s %s", types[0], types[1], types[2], types[3]);
    return mm_strdup(buffer);
}