Change pinmask_to_str() to pinmask_to_strdup()

No longer is the string returned in static space (which the next call
overwrites); instead a mmt_strdup()'d string is returned that needs
mmt_free()'ing.
This commit is contained in:
Stefan Rueger
2024-05-09 19:03:34 +01:00
parent c5c49d7efd
commit 4ccbf49f0f
3 changed files with 34 additions and 32 deletions

View File

@@ -222,10 +222,11 @@ static int set_pin(const PROGRAMMER *pgm, int pinfunc, int value) {
return 0;
}
pmsg_debug("setting pin %s (%s) as %s: %s (%s active)\n",
pinmask_to_str(pin.mask), ftdi_pin_name(pdata, pin),
avr_pin_name(pinfunc),
(value) ? "high" : "low", (pin.inverse[0]) ? "low" : "high");
char *pmsk = pinmask_to_strdup(pin.mask);
pmsg_debug("setting pin %s (%s) as %s: %s (%s active)\n", pmsk,
ftdi_pin_name(pdata, pin), avr_pin_name(pinfunc),
(value) ? "high" : "low", (pin.inverse[0]) ? "low" : "high");
mmt_free(pmsk);
pdata->pin_value = SET_BITS_0(pdata->pin_value, pgm, pinfunc, value);

View File

@@ -748,19 +748,18 @@ const char * avr_pin_lcname(int pinname);
* This function returns a string of defined pins, eg, ~1, 2, ~4, ~5, 7 or ""
*
* @param[in] pindef the pin definition for which we want the string representation
* @returns a pointer to a string, which was created by strdup
* @returns a string that was created by mmt_strdup()
*/
char *pins_to_strdup(const struct pindef_t * const pindef);
/**
* This function returns a string representation of pins in the mask, eg, 1,3,5-7,9,12
* Another execution of this function will overwrite the previous result in the static buffer.
* Consecutive pin number are represented as start-end.
* This function returns a string representation of pins in the mask, eg, 1, 3, 5-7, 9, 12
* Consecutive pin numbers are represented as start-end.
*
* @param[in] pinmask the pin mask for which we want the string representation
* @returns pointer to a static string.
* @returns a string that was created by mmt_strdup()
*/
const char * pinmask_to_str(const pinmask_t * const pinmask);
char *pinmask_to_strdup(const pinmask_t * const pinmask);
/* formerly serial.h */

View File

@@ -152,19 +152,17 @@ int pgm_fill_old_pins(PROGRAMMER * const pgm) {
}
/**
* This function returns a string representation of pins in the mask eg. 1,3,5-7,9,12
* Another execution of this function will overwrite the previous result in the static buffer.
* Consecutive pin number are represented as start-end.
* This function returns a string representation of pins in the mask eg. 1, 3, 5-7, 9, 12
* Consecutive pin numbers are represented as start-end.
*
* @param[in] pinmask the pin mask for which we want the string representation
* @returns pointer to a static string.
* @returns a string that was created by mmt_strdup()
*/
const char * pinmask_to_str(const pinmask_t * const pinmask) {
static char buf[(PIN_MAX + 1) * 5]; // should be enough for PIN_MAX=255
char *pinmask_to_strdup(const pinmask_t * const pinmask) {
char buf[6 * (PIN_MAX + 1)];
char *p = buf;
int n;
int pin;
const char * fmt;
int start = -1;
int end = -1;
@@ -189,11 +187,8 @@ const char * pinmask_to_str(const pinmask_t * const pinmask) {
start = pin;
end = start;
}
if(output) {
fmt = (buf[0] == 0) ? "%d" : ",%d";
n = sprintf(p, fmt, pin);
p += n;
}
if(output)
p += n = sprintf(p, *buf? ", %d": "%d", pin);
}
}
if(start != end) {
@@ -201,10 +196,7 @@ const char * pinmask_to_str(const pinmask_t * const pinmask) {
p += n;
}
if(buf[0] == 0)
return "(no pins)";
return buf;
return mmt_strdup(*buf? buf: "(no pins)");
}
@@ -277,26 +269,36 @@ int pins_check(const PROGRAMMER *const pgm, const struct pin_checklist_t *const
}
if(invalid) {
if(output) {
char *mskinvalid = pinmask_to_strdup(invalid_used);
pmsg_error("%s: these pins are not valid pins for this function: %s\n",
avr_pin_name(pinname), pinmask_to_str(invalid_used));
avr_pin_name(pinname), mskinvalid);
mmt_free(mskinvalid);
char *mskvalid = pinmask_to_strdup(valid_pins->mask);
pmsg_notice("%s: valid pins for this function are: %s\n",
avr_pin_name(pinname), pinmask_to_str(valid_pins->mask));
avr_pin_name(pinname), mskvalid);
mmt_free(mskvalid);
}
is_ok = false;
}
if(inverse) {
if(output) {
char *mskinvalidinv = pinmask_to_strdup(inverse_used);
pmsg_error("%s: these pins are not usable as inverse pins for this function: %s\n",
avr_pin_name(pinname), pinmask_to_str(inverse_used));
avr_pin_name(pinname), mskinvalidinv);
mmt_free(mskinvalidinv);
char *mskvalidinv = pinmask_to_strdup(valid_pins->inverse);
pmsg_notice("%s: valid inverse pins for this function are: %s\n",
avr_pin_name(pinname), pinmask_to_str(valid_pins->inverse));
avr_pin_name(pinname), mskvalidinv);
mmt_free(mskvalidinv);
}
is_ok = false;
}
if(used) {
if(output) {
char *pmsk = pinmask_to_strdup(already_used);
pmsg_error("%s: these pins are set for other functions too: %s\n",
avr_pin_name(pinname), pinmask_to_str(already_used));
avr_pin_name(pinname), pmsk);
mmt_free(pmsk);
is_ok = false;
}
}
@@ -320,7 +322,7 @@ int pins_check(const PROGRAMMER *const pgm, const struct pin_checklist_t *const
* This function returns a string of defined pins, eg, ~1, 2, ~4, ~5, 7 or ""
*
* @param[in] pindef the pin definition for which we want the string representation
* @returns a pointer to a string, which was created by mmt_strdup()
* @returns a string that was created by mmt_strdup()
*/
char *pins_to_strdup(const struct pindef_t * const pindef) {
char buf[6*(PIN_MAX+1)], *p = buf;