Skip to content

Commit

Permalink
convert to new kstr_*() string package
Browse files Browse the repository at this point in the history
  • Loading branch information
jks-prv committed Feb 5, 2017
1 parent dcf8e65 commit d82b00c
Show file tree
Hide file tree
Showing 7 changed files with 178 additions and 64 deletions.
4 changes: 2 additions & 2 deletions extensions/ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,9 @@ char *extint_list_js()
for (i=0; i < n_exts; i++) {
ext_t *ext = ext_list[i];
asprintf(&sb2, "<script src=\"extensions/%s/%s.js\"></script>\n", ext->name, ext->name);
sb = kiwi_strcat(sb, sb2);
sb = kstr_cat(sb, kstr_wrap(sb2));
asprintf(&sb2, "<link rel=\"stylesheet\" type=\"text/css\" href=\"extensions/%s/%s.css\" />\n", ext->name, ext->name);
sb = kiwi_strcat(sb, sb2);
sb = kstr_cat(sb, kstr_wrap(sb2));
}

return sb;
Expand Down
8 changes: 4 additions & 4 deletions rx/rx_server_ajax.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,14 +243,14 @@ char *rx_server_ajax(struct mg_connection *mc)
log_save_t *ls = log_save_p;
int first = MIN(ls->idx, N_LOG_SAVE/2);
for (i = 0; i < first; i++) {
sb = kiwi_strcat_const(sb, (const char *) ls->arr[i]);
sb = kstr_cat(sb, (char *) ls->arr[i]);
}
if (ls->not_shown) {
asprintf(&sb2, "\n--- %d lines not shown ---\n\n", ls->not_shown);
sb = kiwi_strcat(sb, sb2);
sb = kstr_cat(sb, kstr_wrap(sb2));
}
for (; i < ls->idx; i++) {
sb = kiwi_strcat_const(sb, (const char *) ls->arr[i]);
sb = kstr_cat(sb, (char *) ls->arr[i]);
}
break;
}
Expand All @@ -260,6 +260,6 @@ char *rx_server_ajax(struct mg_connection *mc)
break;
}

//printf("AJAX: RTN <%s>\n", sb);
//printf("AJAX: RTN <%s>\n", kstr_sp(sb));
return sb; // NB: sb is free()'d by caller
}
41 changes: 25 additions & 16 deletions rx/rx_util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ bool rx_common_cmd(const char *name, conn_t *conn, char *cmd)
if (current_authkey)
free(current_authkey);
current_authkey = kiwi_authkey();
send_msg(conn, false, "MSG authkey_cb=%s", current_authkey); // get client to request updated dx list
send_msg(conn, false, "MSG authkey_cb=%s", current_authkey);
return true;
}

Expand Down Expand Up @@ -330,7 +330,7 @@ bool rx_common_cmd(const char *name, conn_t *conn, char *cmd)
if (strcmp(cmd, "SET GET_USERS") == 0) {
rx_chan_t *rx;
bool need_comma = false;
sb = kiwi_strcat_const(NULL, "[");
sb = kstr_cat(NULL, "[");
bool isAdmin = (conn->type == STREAM_ADMIN);

for (rx = rx_chan, i=0; rx < &rx_chan[RX_CHANS]; rx++, i++) {
Expand Down Expand Up @@ -360,13 +360,13 @@ bool rx_common_cmd(const char *name, conn_t *conn, char *cmd)
if (n == 0) {
asprintf(&sb2, "%s{\"i\":%d}", need_comma? ",":"", i);
}
sb = kiwi_strcat(sb, sb2);
sb = kstr_cat(sb, kstr_wrap(sb2));
need_comma = true;
}

sb = kiwi_strcat_const(sb, "]");
send_msg(conn, false, "MSG user_cb=%s", sb); // get client to request updated dx list
free(sb);
sb = kstr_cat(sb, "]");
send_msg(conn, false, "MSG user_cb=%s", kstr_sp(sb));
kstr_free(sb);
return true;
}

Expand All @@ -381,6 +381,10 @@ bool rx_common_cmd(const char *name, conn_t *conn, char *cmd)
return true;
}

if (dx.len == 0) {
return true;
}

float freq;
int gid, mkr_off, flags, new_len;
flags = 0;
Expand Down Expand Up @@ -457,7 +461,12 @@ bool rx_common_cmd(const char *name, conn_t *conn, char *cmd)
dx_lastx = 0;
time_t t; time(&t);

if (dx.len == 0) {
return true;
}

asprintf(&sb, "[{\"t\":%ld}", t); // reset appending
sb = kstr_wrap(sb);

for (dp = dx.list, i=j=0; i < dx.len; dp++, i++) {
float freq = dp->freq + (dp->offset / 1000.0); // carrier plus offset
Expand All @@ -484,17 +493,16 @@ bool rx_common_cmd(const char *name, conn_t *conn, char *cmd)
dp->notes? ",\"n\":\"":"", dp->notes? dp->notes:"", dp->notes? "\"":"");
//printf("dx(%d,%.3f,%.0f,%d,\'%s\'%s%s%s)\n", i, f, dp->offset, dp->flags, dp->ident,
// dp->notes? ",\'":"", dp->notes? dp->notes:"", dp->notes? "\'":"");
sb = kiwi_strcat(sb, sb2);
sb = kstr_cat(sb, kstr_wrap(sb2));
}

sb = kiwi_strcat_const(sb, "]");
send_msg(conn, false, "MSG mkr=%s", sb); // get client to request updated dx list
free(sb);
sb = kstr_cat(sb, "]");
send_msg(conn, false, "MSG mkr=%s", kstr_sp(sb));
kstr_free(sb);
return true;
}

if (strcmp(cmd, "SET GET_CONFIG") == 0) {
sb = kiwi_strcat_const(NULL, "{");
asprintf(&sb, "{\"r\":%d,\"g\":%d,\"s\":%d,\"pu\":\"%s\",\"po\":%d,\"pv\":\"%s\",\"n\":%d,\"m\":\"%s\",\"v1\":%d,\"v2\":%d}",
RX_CHANS, GPS_CHANS, ddns.serno, ddns.ip_pub, ddns.port, ddns.ip_pvt, ddns.nm_bits, ddns.mac, VERSION_MAJ, VERSION_MIN);
send_msg(conn, false, "MSG config_cb=%s", sb);
Expand Down Expand Up @@ -523,23 +531,24 @@ bool rx_common_cmd(const char *name, conn_t *conn, char *cmd)
}

asprintf(&sb, "{%s", cpu_stats_buf);
sb = kstr_wrap(sb);

float sum_kbps = audio_kbps + waterfall_kbps + http_kbps;
asprintf(&sb2, ",\"aa\":%.0f,\"aw\":%.0f,\"af\":%.0f,\"at\":%.0f,\"ah\":%.0f,\"as\":%.0f",
audio_kbps, waterfall_kbps, waterfall_fps[ch], waterfall_fps[RX_CHANS], http_kbps, sum_kbps);
sb = kiwi_strcat(sb, sb2);
sb = kstr_cat(sb, kstr_wrap(sb2));

asprintf(&sb2, ",\"ga\":%d,\"gt\":%d,\"gg\":%d,\"gf\":%d,\"gc\":%.6f,\"go\":%d",
gps.acquiring, gps.tracking, gps.good, gps.fixes, adc_clock/1000000, gps.adc_clk_corr);
sb = kiwi_strcat(sb, sb2);
sb = kstr_cat(sb, kstr_wrap(sb2));

extern int audio_dropped;
asprintf(&sb2, ",\"ad\":%d,\"au\":%d,\"ae\":%d}",
audio_dropped, underruns, seq_errors);
sb = kiwi_strcat(sb, sb2);
sb = kstr_cat(sb, kstr_wrap(sb2));

send_msg(conn, false, "MSG stats_cb=%s", sb);
free(sb);
send_msg(conn, false, "MSG stats_cb=%s", kstr_sp(sb));
kstr_free(sb);
return true;
}

Expand Down
146 changes: 123 additions & 23 deletions str.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,44 +120,144 @@ void kiwi_chrrep(char *str, const char from, const char to)
}
}

void kiwi_copy_terminate_free(char *src, char *dst, int size)

struct kstr_t {
//struct kstr_t *next;
char *sp;
int size;
bool ext;
};

#define KSTRINGS 1024
kstr_t kstrings[KSTRINGS];

static kstr_t *kstr_is(char *s)
{
strncpy(dst, src, size);
dst[size-1] = '\0';
free(src);
kstr_t *ks = (kstr_t *) s;
if (ks >= kstrings && ks < &kstrings[KSTRINGS])
return ks;
else
return NULL;
}

// FIXME: change to use a magic header with 2x auto-expanding size
char *kiwi_str(char *s)
static char *kstr_alloc(char *s, int size)
{
int slen = s? strlen(s) : 0;
char *sr = (char *) malloc(slen + SPACE_FOR_NULL);
kstr_t *ks;

if (s) { strcpy(sr, s); } else sr[0] = '\0';
for (ks = kstrings; ks < &kstrings[KSTRINGS]; ks++) {
if (ks->sp == NULL) {
bool ext = false;
if (size) {
assert(s == NULL);
s = (char *) malloc(size);
s[0] = '\0';
//printf("%3d ALLOC %4d %p {%p}\n", ks-kstrings, size, ks, s);
} else {
assert(s != NULL);
size = strlen(s) + SPACE_FOR_NULL;
//printf("%3d ALLOC %4d %p {%p} EXT <%s>\n", ks-kstrings, size, ks, s, s);
ext = true;
}
ks->sp = s;
ks->size = size;
ks->ext = ext;
return (char *) ks;
}
}
panic("kstr_alloc");
return NULL;
}

static char *kstr_what(char *s)
{
char *p;

return sr;
if (s == NULL) return (char *) "NULL";
kstr_t *ks = kstr_is(s);
if (ks) {
asprintf(&p, "#%ld:%d/%lu|%p|{%p}%s",
ks-kstrings, ks->size, strlen(ks->sp), ks, ks->sp, ks->ext? "-EXT":"");
} else {
asprintf(&p, "%p", s);
}
return p;
}

char *kiwi_strcat(char *s1, char *s2)
char *kstr_sp(char *s)
{
int s1len = s1? strlen(s1) : 0;
int s2len = s2? strlen(s2) : 0;
char *sr = (char *) malloc(s1len + s2len + SPACE_FOR_NULL);
kstr_t *ks = kstr_is(s);

if (s1) { strcpy(sr, s1); free(s1); } else sr[0] = '\0';
if (s2) { strcat(sr, s2); free(s2); }
if (ks) {
assert(ks->sp != NULL);
return ks->sp;
} else {
return s;
}
}

char *kstr_wrap(char *s)
{
if (s == NULL) return NULL;
assert (!kstr_is(s));
return kstr_alloc(s, 0);
}

void kstr_free(char *s)
{
if (s == NULL) return;

return sr;
kstr_t *ks = kstr_is(s);

if (ks) {
assert(ks->sp != NULL);
//printf("%3d FREE %4d %p {%p} %s\n", ks-kstrings, ks->size, ks, ks->sp, ks->ext? "EXT":"");
free((char *) ks->sp);
ks->sp = NULL;
ks->size = 0;
ks->ext = false;
}
}

char *kiwi_strcat_const(char *s1, const char *s2)
int kstr_len(char *s)
{
int s1len = s1? strlen(s1) : 0;
int s2len = s2? strlen(s2) : 0;
char *sr = (char *) malloc(s1len + s2len + SPACE_FOR_NULL);
return s? ( strlen(kstr_sp(s)) ) : 0;
}

char *kstr_cpy(char *s1, const char *cs2)
{
char *s2 = (char *) cs2;
//if (!s1 || !s2) return NULL;
assert(s1 && s2);

char *sp1 = kstr_sp(s1);
char *sp2 = kstr_sp(s2);
//printf("kstr_cpy s1=%s {%p} s2=%s {%p}\n", kstr_what(s1), sp1, kstr_what(s2), sp2);
strcpy(sp1, sp2);
return sp1;

if (s1) { strcpy(sr, s1); free(s1); } else sr[0] = '\0';
if (s2) { strcat(sr, s2); }
}

char *kstr_cat(char *s1, const char *cs2)
{
char *s2 = (char *) cs2;
int slen = kstr_len(s1) + kstr_len(s2);
//printf("kstr_cat s1=%s s2=%s\n", kstr_what(s1), kstr_what(s2));
char *sr = kstr_alloc(NULL, slen + SPACE_FOR_NULL);
//printf("kstr_cat sr1=%s\n", kstr_what(sr));
char *srp = kstr_sp(sr);

if (s1) {
strcpy(srp, kstr_sp(s1));
kstr_free(s1);
} else {
srp[0] = '\0';
}

if (s2) {
strcat(srp, kstr_sp(s2));
kstr_free(s2);
}

//printf("kstr_cat sr2=%s\n", kstr_what(sr));
return sr;
}
10 changes: 6 additions & 4 deletions str.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@ char *str_decode_inplace(char *src);
int str2enum(const char *s, const char *strs[], int len);
const char *enum2str(int e, const char *strs[], int len);
void kiwi_chrrep(char *str, const char from, const char to);
void kiwi_copy_terminate_free(char *src, char *dst, int size);

char *kiwi_str(char *s);
char *kiwi_strcat(char *s1, char *s2);
char *kiwi_strcat_const(char *s1, const char *s2);
char *kstr_sp(char *s);
char *kstr_wrap(char *s);
void kstr_free(char *s);
int kstr_len(char *s);
char *kstr_cpy(char *s1, const char *s2);
char *kstr_cat(char *s1, const char *s2);
Loading

0 comments on commit d82b00c

Please sign in to comment.