5 puskurinen printf rutiini

Edellisestä postista muodostui oikea TLDR-paketti (https://moijari.com/?p=1256) , ja ajattelinkin kirjoittaa lyhyempiä kappaleita sen “valmiista” osista. Toinen TLDR-paketti: (https://moijari.com/?p=964).

Suurimpia asioita tertussa on se, että saatiin aikaan toimiva kyselymalli, ja https- ja http- palvelimet, eli DBS osuus ovat pitkällä, Myös DB osuus on periaatteessa toimiva pientä tietokantaa varten. Käännöksistä saatiin ensimmäiset ideat. Db-osuuteen voi tietenkkin tulla lisäasioita sovelluksen puolelta kuten summaus. Save yms vielä puuttuu. Muutamassa seuraavassa postissa kuitenkin toimivat uudet osuudet lukukelpoisemmissa listoissa.

Aluksi uusi printf rutiini:

int html_now = 0;
unsigned char *html[] = { NULL, NULL, NULL, NULL, NULL };
int html_size[] = { 0, 0, 0, 0, 0 };

Html_now kenttä sisältää tämän hetken käytössä olevan puskurin numeron. Html kenttä sisältää kaikkien viiden puskurien sisältämän merkkijonon ja html_size kenttä sisältää kaikkien viiden puskurin allokoidun koon.

void html_set(int bufno)
{
  html_now=bufno;
  if(html[bufno]==NULL) {
    html_size[bufno] = 10;
    html[bufno]=malloc(html_size[bufno]);
  }
}

Html_set rutiinilla valitaan puskurinumero, johon seuraavat printf lauseet tulostavat merkkijonon.

int html_get()
{
  return(html_now);
}

Html get rutiini palauttaa puskurin numeron, johon seuraava printf lause tulostuu.

unsigned char *html_get_string(int bufno)
{
  return(html[bufno]);
}

Html_get_string rutiini palauttaa valitussa puskurissa olevan merkkijonon.

void html_clear()
{
  html_set(html_now);
  html[html_now][0]='\0';
}

Html_clear tyhjentää tämän hetkisen puskurin.

void html_clear_all()
{
  int c;
  for(c=0;c<HTML_BUFFERS;c++) {
    html_set(c);
    html_clear();
  }
}

Html_clear_all tyhjentää kaikki puskurit.

static void html_printf_valist(const char *format, va_list ap)
{
  int count;
  static char *printbuf=NULL;
  static int printbuf_len=0;

  va_list ap2;
  va_copy(ap2,ap);

  count=vsnprintf(printbuf, printbuf_len, format, ap) + 1;
  if(printbuf_len < count) {
    printbuf_len = count;
    printbuf=realloc(printbuf, printbuf_len);
    count=vsnprintf(printbuf, printbuf_len, format, ap2) + 1;
  }

  if(html_size[html_now] <
     strlen(html[html_now]) +
     strlen(printbuf) + 1) {
    html_size[html_now] =
     strlen(html[html_now]) +
     strlen(printbuf) + 1;
    html[html_now] = realloc(html[html_now], html_size[html_now]);
  }

  strcpy(html[html_now]+strlen(html[html_now]), printbuf);
}

html_printf_valist on apufunktio kahdelle viimeiselle printf rutiinille.

void html_printf(const char *format, ...)
{
  va_list args;

  va_start(args, format);
  html_printf_valist(format, args);
  va_end(args);
}

html_printf rutiini tulostaa tämänhetkiseen puskuriin merkkijonon.

void html_buf_printf(int bufno, const char *format, ...)
{
  int save_html;
  va_list args;

  save_html=html_get();
  html_set(bufno);
  va_start(args, format);
  html_printf_valist(format, args);
  va_end(args);
  html_set(save_html);
}

Ja tämä viimeinen html_buf_printf tulostaa haluttuun puskuriin merkkijonon.

Published
Categorized as muuta