spif_bool_t spif_url_done(spif_url_t self) { ASSERT_RVAL(!SPIF_URL_ISNULL(self), FALSE); if (!SPIF_STR_ISNULL(self->proto)) { spif_str_del(self->proto); self->proto = (spif_str_t) NULL; } if (!SPIF_STR_ISNULL(self->user)) { spif_str_del(self->user); self->user = (spif_str_t) NULL; } if (!SPIF_STR_ISNULL(self->passwd)) { spif_str_del(self->passwd); self->passwd = (spif_str_t) NULL; } if (!SPIF_STR_ISNULL(self->host)) { spif_str_del(self->host); self->host = (spif_str_t) NULL; } if (!SPIF_STR_ISNULL(self->port)) { spif_str_del(self->port); self->port = (spif_str_t) NULL; } if (!SPIF_STR_ISNULL(self->path)) { spif_str_del(self->path); self->path = (spif_str_t) NULL; } if (!SPIF_STR_ISNULL(self->query)) { spif_str_del(self->query); self->query = (spif_str_t) NULL; } spif_str_done(SPIF_STR(self)); return TRUE; }
spif_bool_t spif_str_del(spif_str_t self) { ASSERT_RVAL(!SPIF_STR_ISNULL(self), FALSE); spif_str_done(self); SPIF_DEALLOC(self); return TRUE; }
spif_bool_t spif_url_unparse(spif_url_t self) { ASSERT_RVAL(!SPIF_URL_ISNULL(self), FALSE); spif_str_done(SPIF_STR(self)); spif_str_init_from_ptr(SPIF_STR(self), SPIF_CHARPTR("")); /* First, proto followed by a colon. */ if (!SPIF_STR_ISNULL(self->proto)) { spif_str_append(SPIF_STR(self), self->proto); spif_str_append_char(SPIF_STR(self), ':'); } /* If we have a port but no host, make it localhost. */ if (!SPIF_STR_ISNULL(self->port) && SPIF_STR_ISNULL(self->host)) { self->host = spif_str_new_from_ptr(SPIF_CHARPTR("localhost")); } /* We need the // if we have a hostname. */ if (!SPIF_STR_ISNULL(self->host)) { spif_str_append_from_ptr(SPIF_STR(self), SPIF_CHARPTR("//")); } if (!SPIF_STR_ISNULL(self->user)) { spif_str_append(SPIF_STR(self), self->user); if (!SPIF_STR_ISNULL(self->passwd)) { spif_str_append_char(SPIF_STR(self), ':'); spif_str_append(SPIF_STR(self), self->passwd); } spif_str_append_char(SPIF_STR(self), '@'); } if (!SPIF_STR_ISNULL(self->host)) { spif_str_append(SPIF_STR(self), self->host); if (!SPIF_STR_ISNULL(self->port)) { spif_str_append_char(SPIF_STR(self), ':'); spif_str_append(SPIF_STR(self), self->port); } } if (!SPIF_STR_ISNULL(self->path)) { spif_str_append(SPIF_STR(self), self->path); } if (!SPIF_STR_ISNULL(self->query)) { spif_str_append_char(SPIF_STR(self), '?'); spif_str_append(SPIF_STR(self), self->query); } return TRUE; }
spif_bool_t spif_str_trim(spif_str_t self) { spif_charptr_t start, end; ASSERT_RVAL(!SPIF_STR_ISNULL(self), FALSE); start = self->s; end = self->s + self->len - 1; for (; isspace((spif_uchar_t) (*start)) && (start < end); start++); for (; isspace((spif_uchar_t) (*end)) && (start < end); end--); if (start > end) { return spif_str_done(self); } *(++end) = 0; self->len = (spif_stridx_t) (end - start); self->size = self->len + 1; memmove(self->s, start, self->size); self->s = (spif_charptr_t) REALLOC(self->s, self->size); return TRUE; }
spif_bool_t spif_str_sprintf(spif_str_t self, spif_charptr_t format, ...) { va_list ap; ASSERT_RVAL(!SPIF_STR_ISNULL(self), FALSE); if (self->s != (spif_charptr_t) NULL) { spif_str_done(self); } if (!format) { return FALSE; } else if (*format == 0) { return TRUE; } else { int c; char buff[2]; va_start(ap, format); c = vsnprintf(buff, sizeof(buff), format, ap); va_end(ap); if (c <= 0) { return FALSE; } else { self->size = c + 1; self->s = (spif_charptr_t) MALLOC(self->size); va_start(ap, format); c = vsnprintf(self->s, self->size, format, ap); va_end(ap); if (c > -1 && c < self->size) { self->len = c; return TRUE; } else { self->s[0] = 0; return FALSE; } } } ASSERT_NOTREACHED_RVAL(FALSE); }