naver / rye

RYE, Native Sharding RDBMS

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

refactor: do not use setjmp, longjmp in rsql

iamksseo opened this issue · comments

  • remove rsql_display() pattern, instead use rsql_display_simple pattern()
#include <stdio.h>
#include <unistd.h>
#include <setjmp.h>
#include <signal.h>

static jmp_buf iq_Jmp_buf;

void
iq_pipe_handler (int sig_no)
{
  longjmp (iq_Jmp_buf, 1);
}

FILE *
rsql_popen (const char *cmd)
{
  return popen (cmd, "w"); /* pipe stream to pager */
}

void
rsql_pclose (FILE * fp)
{
  if (!fp)
    {
      return;
    }

  pclose (fp);
}

void
rsql_fputs (const char *str, FILE * fp)
{
  if (!fp)
    {
      return;
    }

  for ( ; *str != '\0'; str++)
    {
      putc (*str, fp);
    }
  putc ('\n', fp);
}

void
rsql_display_simple (const char *msg)
{
  FILE *fp;

  fp = rsql_popen ("more");

  while (1)
    {
      rsql_fputs (msg, fp);
//      sleep (1);
    }

  rsql_pclose (fp);
}

void
rsql_display (const char *msg)
{
  void (*iq_pipe_save) (int sig);

  iq_pipe_save = signal (SIGPIPE, &iq_pipe_handler);
  if (setjmp (iq_Jmp_buf) == 0)
    {
      rsql_display_simple (msg);
    }
  else
    {
      fprintf(stdout, "interrupt exit\n");
    }
  signal (SIGPIPE, iq_pipe_save);
}

int main (int argc, char *argv[])
{
  if (argc < 2)
    {
      rsql_display ("hello world");
    }
  else
    {
      rsql_display_simple ("hello world simple");
    }

  return 0;
}