2024年2月

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

//1:3:5:7:8:20:28:40
//80080800D5
//213,0,8,8,128,0,0,0

//#define ZXIC

#ifdef ZXIC
#define BAND_WIDTH 8
#else
#define BAND_WIDTH 4
#endif

int str_reverse(char *str)
{   
    int i, j;
    char c;
    
    if (NULL == str || (j = strlen(str)) == 0)
        return -1;
    
    for (i = 0, j--; i < j; i++, j--) {
        c = str[i];
        str[i] = str[j];
        str[j] = c;
    }
    
    return 0;
}

void get_band_value(int band, int *offset, int *value)
{
    int temp;

    *offset = band / BAND_WIDTH;
    temp = band % BAND_WIDTH;
    if (temp == 0) {
        (*offset)--;
#ifdef ZXIC
        temp = BAND_WIDTH;
#else
        temp = 2 * BAND_WIDTH;
#endif
    }
#ifdef ZXIC
    *value = pow(2, temp - 1);
#else
    if (temp == BAND_WIDTH - 1) {
        temp = BAND_WIDTH;
    }
    *value = temp;
#endif
}

int get_frequency_bands(char *band, char *bandBuf)
{
    int bandValue, offset, value;
    char *ptr = NULL, temp[64] = {0};
#ifdef ZXIC
    int i, tempBuf[9] = {0};
#endif

    if (NULL == band || NULL == bandBuf || strlen(band) == 0)
        return -1;

    memcpy(temp, band, strlen(band));
    if ((ptr = strtok(temp, ":")) == NULL) {
        ptr = temp;
    }
    do {
        if ((bandValue = atoi(ptr)) <= 0)
            return -1;
        get_band_value(bandValue, &offset, &value);
#ifdef ZXIC
        tempBuf[offset] += value;
#else
        bandBuf[offset] += value;
        if (bandBuf[offset] > '9') {
            bandBuf[offset] += ('A' - '9' - 1);
        }
#endif
        ptr = strtok(NULL, ":");
    } while (ptr);
#ifdef ZXIC
    offset = 0;
    for (i = 0; i < BAND_WIDTH; i++) {
        offset += sprintf(&bandBuf[offset], "%d,", tempBuf[i]);
    }
    bandBuf[--offset] = '\0';
#else
    bandBuf[++offset] = '\0';
#endif

#ifdef ZXIC
    return 0;
#else
    return str_reverse(bandBuf);
#endif
}

int main(int argc, char *argv[])
{
    char band[32] = "00000000000000000000";

    get_frequency_bands("1:3:5:7:8:20:28:40", band);
    printf("band:%s\n", band);

    return 0;
}