refactor: do not use setjmp, longjmp in rsql
iamksseo opened this issue · comments
kyungsik.seo commented
- 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;
}