📄 dmalloc_argv.c
字号:
"%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 + -