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

📄 dmalloc_argv.c

📁 减少内存碎片的malloc分配函数
💻 C
📖 第 1 页 / 共 5 页
字号:
			"%s: %s, no ARGV_MAYBE's can follow a MAND or MAYBE array\n",			argv_program, INTERNAL_ERROR_NAME);	}	if (argv_interactive) {	  (void)exit(EXIT_CODE);	}	return ERROR;      }            maybe_field_b = ARGV_TRUE;      if (arg_p->ar_type & ARGV_FLAG_ARRAY) {	mand_array_b = ARGV_TRUE;      }    }        /* handle initializing the argument array */    if (arg_p->ar_type & ARGV_FLAG_ARRAY) {      argv_array_t	*arrp = (argv_array_t *)arg_p->ar_variable;            if (! HAS_ARG(arg_p->ar_type)) {	if (argv_error_stream != NULL) {	  (void)fprintf(argv_error_stream,			"%s: %s, cannot have an array of boolean values\n",			argv_program, INTERNAL_ERROR_NAME);	}	if (argv_interactive) {	  (void)exit(EXIT_CODE);	}	return ERROR;      }      if (ARGV_TYPE(arg_p->ar_type) == ARGV_INCR) {	if (argv_error_stream != NULL) {	  (void)fprintf(argv_error_stream,			"%s: %s, cannot have an array of incremental values\n",			argv_program, INTERNAL_ERROR_NAME);	}	if (argv_interactive) {	  (void)exit(EXIT_CODE);	}	return ERROR;      }      arrp->aa_entry_n = 0;    }        /* verify variable pointer */    if (arg_p->ar_variable == NULL	&& arg_p->ar_short_arg != ARGV_OR	&& arg_p->ar_short_arg != ARGV_XOR) {      if (argv_error_stream != NULL) {	(void)fprintf(argv_error_stream,		      "%s: %s, NULL variable specified in arg array\n",		      argv_program, INTERNAL_ERROR_NAME);      }      if (argv_interactive) {	(void)exit(EXIT_CODE);      }      return ERROR;    }        /* verify [X]OR's */    if (arg_p->ar_short_arg == ARGV_OR	|| arg_p->ar_short_arg == ARGV_XOR) {            /* that they are not at the start or end of list */      if (arg_p == args || arg_p >= (args + arg_n - 1)) {	if (argv_error_stream != NULL) {	  (void)fprintf(argv_error_stream,			"%s: %s, ARGV_[X]OR entries cannot be at start or end of array\n",			argv_program, INTERNAL_ERROR_NAME);	}	if (argv_interactive) {	  (void)exit(EXIT_CODE);	}	return ERROR;      }            /* that two aren't next to each other */      if ((arg_p - 1)->ar_short_arg == ARGV_OR	  || (arg_p - 1)->ar_short_arg == ARGV_XOR) {	if (argv_error_stream != NULL) {	  (void)fprintf(argv_error_stream,			"%s: %s, two ARGV_[X]OR entries cannot be next to each other\n",			argv_program, INTERNAL_ERROR_NAME);	}	if (argv_interactive) {	  (void)exit(EXIT_CODE);	}	return ERROR;      }    }  }    return NOERROR;}/* * static int string_to_value * * DESCRIPTION: * * Translate string value argument into a variable value depending on * its type. * * RETURNS: * * Success - 0 * * Faulure - -1 * * ARGUMENTS: * * arg - Argument string. * * var - Pointer to our variable. * * type - Type of the variable. */static	int	string_to_value(const char *arg, ARGV_PNT var,				const unsigned int type){  argv_array_t	*arr_p;  argv_type_t	*type_p;  unsigned int	val_type = ARGV_TYPE(type), size = 0;    /* find the type and the size for array */  for (type_p = argv_types; type_p->at_value != 0; type_p++) {    if (type_p->at_value == val_type) {      size = type_p->at_size;      break;    }  }    if (type_p->at_value == 0) {    if (argv_error_stream != NULL) {      (void)fprintf(argv_error_stream, "%s: illegal variable type %d\n",		    __FILE__, val_type);    }    return ERROR;  }    if (type & ARGV_FLAG_ARRAY) {    arr_p = (argv_array_t *)var;        if (arr_p->aa_entry_n == 0) {      arr_p->aa_entries = (char *)malloc(ARRAY_INCR *size);    }    else if (arr_p->aa_entry_n % ARRAY_INCR == 0) {      arr_p->aa_entries =	(char *)realloc(arr_p->aa_entries, (arr_p->aa_entry_n + ARRAY_INCR) *			size);    }        if (arr_p->aa_entries == NULL) {      if (argv_error_stream != NULL) {	(void)fprintf(argv_error_stream,		      "%s: memory error during argument processing\n",		      argv_program);      }      if (argv_interactive) {	(void)exit(EXIT_CODE);      }      return ERROR;    }        var = (char *)(arr_p->aa_entries) + arr_p->aa_entry_n * size;    arr_p->aa_entry_n++;  }    /* translate depending on type */  switch (val_type) {      case ARGV_BOOL:    /* if no close argument, set to true */    if (arg == NULL) {      *(char *)var = ARGV_TRUE;    }    else if (*(char *)arg == 't' || *(char *)arg == 'T'	     || *(char *)arg == 'y' || *(char *)arg == 'Y'	     || *(char *)arg == '1') {      *(char *)var = ARGV_TRUE;    }    else {      *(char *)var = ARGV_FALSE;    }    break;      case ARGV_BOOL_NEG:    /* if no close argument, set to false */    if (arg == NULL) {      *(char *)var = ARGV_FALSE;    }    else if (*(char *)arg == 't' || *(char *)arg == 'T'	     || *(char *)arg == 'y' || *(char *)arg == 'Y'	     || *(char *)arg == '1') {      *(char *)var = ARGV_TRUE;    }    else {      *(char *)var = ARGV_FALSE;    }    break;      case ARGV_BOOL_ARG:    if (*(char *)arg == 't' || *(char *)arg == 'T'	|| *(char *)arg == 'y' || *(char *)arg == 'Y'	|| *(char *)arg == '1') {      *(char *)var = ARGV_TRUE;    }    else {      *(char *)var = ARGV_FALSE;    }    break;      case ARGV_CHAR:    *(char *)var = *(char *)arg;    break;      case ARGV_CHAR_P:    *(char **)var = string_copy((char *)arg);    if (*(char **)var == NULL) {      return ERROR;    }    break;      case ARGV_SHORT:    *(short *)var = (short)atoi(arg);    break;      case ARGV_U_SHORT:    *(unsigned short *)var = (unsigned short)atoi(arg);    break;      case ARGV_INT:    *(int *)var = atoi(arg);    break;      case ARGV_U_INT:    *(unsigned int *)var = atoi(arg);    break;      case ARGV_LONG:    *(long *)var = atol(arg);    break;      case ARGV_U_LONG:    *(unsigned long *)var = atol(arg);    break;      case ARGV_FLOAT:    (void)sscanf(arg, "%f", (float *)var);    break;      case ARGV_DOUBLE:    (void)sscanf(arg, "%lf", (double *)var);    break;      case ARGV_BIN:    *(int *)var = btoi(arg);    break;      case ARGV_OCT:    *(int *)var = otoi(arg);    break;      case ARGV_HEX:    *(int *)var = htoi(arg);    break;      case ARGV_INCR:    /* if no close argument then increment else set the value */    if (arg == NULL) {      (*(int *)var)++;    }    else {      *(int *)var = atoi(arg);    }    break;      case ARGV_SIZE:    {      const char	*arg_p;      long		val;            /* take initial integer point */      val = atol(arg);      for (arg_p = arg;	   *arg_p == ' ' || *arg_p == '-' || *arg_p == '+'	     || (*arg_p >= '0' && *arg_p <= '9');	   arg_p++) {      }      if (*arg_p == 'b' || *arg_p == 'B') {	val *= 1;      }      else if (*arg_p == 'k' || *arg_p == 'B') {	val *= 1024;      }      else if (*arg_p == 'm' || *arg_p == 'M') {	val *= 1024 * 1024;      }      else if (*arg_p == 'g' || *arg_p == 'G') {	val *= 1024 * 1024 * 1024;      }      *(long *)var = val;    }    break;      case ARGV_U_SIZE:    {      const char	*arg_p;      unsigned long	val;            /* take initial integer point */      val = (unsigned long)atol(arg);      for (arg_p = arg;	   *arg_p == ' ' || *arg_p == '-' || *arg_p == '+'	     || (*arg_p >= '0' && *arg_p <= '9');	   arg_p++) {      }      if (*arg_p == 'b' || *arg_p == 'B') {	val *= 1;      }      else if (*arg_p == 'k' || *arg_p == 'B') {	val *= 1024;      }      else if (*arg_p == 'm' || *arg_p == 'M') {	val *= 1024 * 1024;      }      else if (*arg_p == 'g' || *arg_p == 'G') {	val *= 1024 * 1024 * 1024;      }      *(unsigned long *)var = val;    }    break;      case ARGV_BOOL_INT:    /* if no close argument, set to true */    if (arg == NULL) {      *(int *)var = ARGV_TRUE;    }    else if (*(char *)arg == 't' || *(char *)arg == 'T'	     || *(char *)arg == 'y' || *(char *)arg == 'Y'	     || *(char *)arg == '1') {      *(int *)var = ARGV_TRUE;    }    else {      *(int *)var = ARGV_FALSE;    }    break;      case ARGV_BOOL_INT_NEG:    /* if no close argument, set to false */    if (arg == NULL) {      *(int *)var = ARGV_FALSE;    }    else if (*(char *)arg == 't' || *(char *)arg == 'T'	     || *(char *)arg == 'y' || *(char *)arg == 'Y'	     || *(char *)arg == '1') {      *(int *)var = ARGV_TRUE;    }    else {      *(int *)var = ARGV_FALSE;    }    break;      case ARGV_BOOL_INT_ARG:    if (*(char *)arg == 't' || *(char *)arg == 'T'	|| *(char *)arg == 'y' || *(char *)arg == 'Y'	|| *(char *)arg == '1') {      *(int *)var = ARGV_TRUE;    }    else {      *(int *)var = ARGV_FALSE;    }    break;      }    return NOERROR;}/* * static int value_to_string * * DESCRIPTION: * * Translate value from variable depending on its type intoits string * represetnation in buffer. * * RETURNS: * * Number of characters added to the buffer. * * ARGUMENTS: * * var - Variable pointer. * * type - Type of variable. * * buf - User buffer to convert into. * * buf_size - Size of the user buffer. */static	int	value_to_string(const ARGV_PNT var, const unsigned int type,				char *buf, const int buf_size){  int	len = 0;    /*   * NOTE: without a snprintf, we have to hope that buf_size > integer   * and the string repesentations of the numbers.   */     /* translate depending on type */  switch (ARGV_TYPE(type)) {      case ARGV_BOOL:  case ARGV_BOOL_NEG:  case ARGV_BOOL_ARG:    if (*(char *)var) {      strncpy(buf, "true (! 0)", buf_size);    }    else {      strncpy(buf, "false (0)", buf_size);    }    buf[buf_size - 1] = '\0';    len = strlen(buf);    break;      case ARGV_CHAR:    len = expand_buf((char *)var, 1, buf, buf_size);    break;      case ARGV_CHAR_P:    if (*(char **)var == NULL) {      strncpy(buf, "(null)", buf_size);      buf[buf_size - 1] = '\0';      len = strlen(buf);    }    else {      len = expand_buf(*(char **)var, -1, buf, buf_size);    }    break;      case ARGV_SHORT:    (void)loc_snprintf(buf, buf_size, "%d", *(short *)var);    len = strlen(buf);    break;      case ARGV_U_SHORT:    (void)loc_snprintf(buf, buf_size, "%d", *(unsigned short *)var);    len = strlen(buf);    break;      case ARGV_INT:    (void)loc_snprintf(buf, buf_size, "%d", *(int *)var);    len = strlen(buf);    break;      case ARGV_U_INT:    (void)loc_snprintf(buf, buf_size, "%u", *(unsigned int *)var);    len = strlen(buf);    break;      case ARGV_LONG:    (void)loc_snprintf(buf, buf_size, "%ld", *(long *)var);    len = strlen(buf);    break;      case ARGV_U_LONG:    (void)loc_snprintf(buf, buf_size, "%lu", *(unsigned long *)var);    len = strlen(buf);    break;      case ARGV_FLOAT:    (void)loc_snprintf(buf, buf_size, "%f", *(float *)var);    len = strlen(buf);    break;      case ARGV_DOUBLE:    (void)loc_snprintf(buf, buf_size, "%f", *(double *)var);    len = strlen(buf);    break;        /* this should be a routine */  case ARGV_BIN:    {      int	bit_c, bit, first_b = ARGV_FALSE;      char	binary[2 + 128 + 1], *bounds, *bin_p;            if (*(int *)var == 0) {	strncpy(buf, "0", buf_size);      }      else {	bin_p = binary;	bounds = binary + sizeof(binary);		/* initially write binary number into tmp buffer, then copy into out */	*bin_p++ = '0';	*bin_p++ = 'b';		for (bit_c = sizeof(int) * BITS_IN_BYTE - 1; bit_c >= 0; bit_c--) {	  bit = *(int *)var & (1 << bit_c);	  	  if (bit == 0) {	    if (first_b) {	      *bin_p++ = '0';	    }	  }	  else {	    *bin_p++ = '1';	    first_b = ARGV_TRUE;	  }	}		/* add on the decimal equivalent */ 	(void)loc_snprintf(bin_p, bounds - bin_p, " (%d)", *(int *)var);	/* find the \0 at end */ 	for (; *bin_p != '\0'; bin_p++) {	}		/* now we copy from the binary buffer to the output */	strncpy(buf, binary, buf_size);      }            buf[buf_size - 1] = '\0';      len = strlen(buf);    }    break;      case ARGV_OCT:    if (*(int *)var == 0) {      (void)strncpy(buf, "0", buf_size);      buf[buf_size - 1] = '\0';    }    else {      (void)loc_snprintf(buf, buf_size, "%#o (%d)", *(int *)var, *(int *)var);    }    len = strlen(buf);    break;      case ARGV_HEX:    if (*(int *)var == 0) {      (void)strcpy(buf, "0");    }    else {      (void)loc_snprintf(buf, buf_size, "%#x (%d)", *(int *)var, *(int *)var);

⌨️ 快捷键说明

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