| /* |
| * 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); |
| } |