static void test_ungetc(CuTest *tc) { apr_file_t *f = NULL; apr_status_t rv; char ch; rv = apr_file_open(&f, FILENAME, APR_READ, 0, p); CuAssertIntEquals(tc, APR_SUCCESS, rv); apr_file_getc(&ch, f); CuAssertIntEquals(tc, APR_SUCCESS, rv); CuAssertIntEquals(tc, (int)TESTSTR[0], (int)ch); apr_file_ungetc('X', f); CuAssertIntEquals(tc, APR_SUCCESS, rv); apr_file_getc(&ch, f); CuAssertIntEquals(tc, APR_SUCCESS, rv); CuAssertIntEquals(tc, 'X', (int)ch); apr_file_close(f); }
static void test_ungetc(abts_case *tc, void *data) { apr_file_t *f = NULL; apr_status_t rv; char ch; rv = apr_file_open(&f, FILENAME, APR_READ, 0, p); ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); apr_file_getc(&ch, f); ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); ABTS_INT_EQUAL(tc, (int)TESTSTR[0], (int)ch); apr_file_ungetc('X', f); ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); apr_file_getc(&ch, f); ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); ABTS_INT_EQUAL(tc, 'X', (int)ch); apr_file_close(f); }
static int apache_read_line_fn(lily_lex_entry *entry) { char ch; int bufsize, i, ok, utf8_check; lily_lex_state *lexer = entry->lexer; char *input_buffer = lexer->input_buffer; apr_file_t *input_file = (apr_file_t *)entry->source; apr_status_t result; bufsize = lexer->input_size; i = 0; utf8_check = 0; while (1) { result = apr_file_getc(&ch, input_file); if (result != APR_SUCCESS) { if ((i + 1) == bufsize) { lily_grow_lexer_buffers(lexer); input_buffer = lexer->input_buffer; } lexer->input_buffer[i] = '\n'; lexer->input_end = i + 1; /* If i is 0, then nothing is on this line except eof. Return 0 to let the caller know this is the end. * If it isn't, then there's stuff with an unexpected eof at the end. Return 1, then 0 the next time. */ ok = !!i; /* Make sure the second eof found does not increment the line number again. */ if (lexer->hit_eof == 0) { lexer->line_num++; lexer->hit_eof = 1; } break; } /* i + 2 is used so that when \r\n that the \n can be safely added to the buffer. Otherwise, it would be i + 1. */ if ((i + 2) == bufsize) { lily_grow_lexer_buffers(lexer); /* Do this in case the realloc decides to use a different block instead of growing what it had. */ input_buffer = lexer->input_buffer; } input_buffer[i] = ch; if (ch == '\r' || ch == '\n') { lexer->input_end = i; lexer->line_num++; ok = 1; if (ch == '\r') { apr_file_getc(&ch, input_file); if (ch != '\n') apr_file_ungetc(ch, input_file); else { /* This is safe: See i + 2 == size comment above. */ lexer->input_buffer[i+1] = ch; lexer->input_end++; } } break; } else if (((unsigned char)ch) > 127) utf8_check = 1; i++; } if (utf8_check) lily_lexer_utf8_check(lexer); return ok; }