blob: abc2f8a7f626ec310df35032281d04066e8a7bf6 [file] [log] [blame]
/*
* Copyright 1988,1990,1993,1994 by Paul Vixie
* All rights reserved
*
* Distribute freely, except: don't remove my name from the source or
* documentation (don't take credit for my work), mark your changes (don't
* get me blamed for your possible bugs), don't alter or remove this
* notice. May be sold if buildable source is provided to buyer. No
* warrantee of any kind, express or implied, is included with this
* software; use at your own risk, responsibility for damages (if any) to
* anyone resulting from the use of this software rests entirely with the
* user.
*
* Send bug reports, bug fixes, enhancements, requests, flames, etc., and
* I'll try to keep a version up to date. I can be reached as follows:
* Paul Vixie <paul@vix.com> uunet!decwrl!vixie!paul
*/
/*
* marco 07nov16 [removed code not needed by pg_cron]
* marco 04sep16 [integrated into pg_cron]
* vix 26jan87 [RCS has the rest of the log]
* vix 30dec86 [written]
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include "task/cron.h"
/*
* get_char(file) : like getc() but increment LineNumber on newlines
*/
int
get_char(file)
FILE *file;
{
int ch;
/*
* Sneaky hack: we wrapped an in-memory buffer into a FILE*
* to minimize changes to cron.c.
*
* This code replaces:
* ch = getc(file);
*/
file_buffer *buffer = (file_buffer *) file;
if (buffer->unget_count > 0)
{
ch = buffer->unget_data[--buffer->unget_count];
}
else if (buffer->pointer == buffer->length)
{
ch = '\0';
buffer->pointer++;
}
else if (buffer->pointer > buffer->length)
{
ch = EOF;
}
else
{
ch = buffer->data[buffer->pointer++];
}
if (ch == '\n')
Set_LineNum(LineNumber + 1);
return ch;
}
/*
* unget_char(ch, file) : like ungetc but do LineNumber processing
*/
void
unget_char(ch, file)
int ch;
FILE *file;
{
/*
* Sneaky hack: we wrapped an in-memory buffer into a FILE*
* to minimize changes to cron.c.
*
* This code replaces:
* ungetc(ch, file);
*/
file_buffer *buffer = (file_buffer *) file;
if (buffer->unget_count >= 1024)
{
perror("ungetc limit exceeded");
exit(ERROR_EXIT);
}
buffer->unget_data[buffer->unget_count++] = ch;
if (ch == '\n')
Set_LineNum(LineNumber - 1);
}
/*
* get_string(str, max, file, termstr) : like fgets() but
* (1) has terminator string which should include \n
* (2) will always leave room for the null
* (3) uses get_char() so LineNumber will be accurate
* (4) returns EOF or terminating character, whichever
*/
int
get_string(string, size, file, terms)
char *string;
int size;
FILE *file;
char *terms;
{
int ch;
while (EOF != (ch = get_char(file)) && !strchr(terms, ch)) {
if (size > 1) {
*string++ = (char) ch;
size--;
}
}
if (size > 0)
*string = '\0';
return ch;
}
/*
* skip_comments(file) : read past comment (if any)
*/
void
skip_comments(file)
FILE *file;
{
int ch;
while (EOF != (ch = get_char(file))) {
/* ch is now the first character of a line. */
while (ch == ' ' || ch == '\t')
ch = get_char(file);
if (ch == EOF)
break;
/* ch is now the first non-blank character of a line. */
if (ch != '\n' && ch != '#')
break;
/*
* ch must be a newline or comment as first non-blank
* character on a line.
*/
while (ch != '\n' && ch != EOF)
ch = get_char(file);
/* ch is now the newline of a line which we're going to ignore. */
}
if (ch != EOF)
unget_char(ch, file);
}