mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 15:41:43 +00:00 
			
		
		
		
	
		
			
	
	
		
			56 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			56 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include "Python.h"
							 | 
						||
| 
								 | 
							
								#include "errcode.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "helpers.h"
							 | 
						||
| 
								 | 
							
								#include "../lexer/state.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static int
							 | 
						||
| 
								 | 
							
								tok_underflow_string(struct tok_state *tok) {
							 | 
						||
| 
								 | 
							
								    char *end = strchr(tok->inp, '\n');
							 | 
						||
| 
								 | 
							
								    if (end != NULL) {
							 | 
						||
| 
								 | 
							
								        end++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        end = strchr(tok->inp, '\0');
							 | 
						||
| 
								 | 
							
								        if (end == tok->inp) {
							 | 
						||
| 
								 | 
							
								            tok->done = E_EOF;
							 | 
						||
| 
								 | 
							
								            return 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (tok->start == NULL) {
							 | 
						||
| 
								 | 
							
								        tok->buf = tok->cur;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    tok->line_start = tok->cur;
							 | 
						||
| 
								 | 
							
								    ADVANCE_LINENO();
							 | 
						||
| 
								 | 
							
								    tok->inp = end;
							 | 
						||
| 
								 | 
							
								    return 1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Set up tokenizer for UTF-8 string */
							 | 
						||
| 
								 | 
							
								struct tok_state *
							 | 
						||
| 
								 | 
							
								_PyTokenizer_FromUTF8(const char *str, int exec_input, int preserve_crlf)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    struct tok_state *tok = _PyTokenizer_tok_new();
							 | 
						||
| 
								 | 
							
								    char *translated;
							 | 
						||
| 
								 | 
							
								    if (tok == NULL)
							 | 
						||
| 
								 | 
							
								        return NULL;
							 | 
						||
| 
								 | 
							
								    tok->input = translated = _PyTokenizer_translate_newlines(str, exec_input, preserve_crlf, tok);
							 | 
						||
| 
								 | 
							
								    if (translated == NULL) {
							 | 
						||
| 
								 | 
							
								        _PyTokenizer_Free(tok);
							 | 
						||
| 
								 | 
							
								        return NULL;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    tok->decoding_state = STATE_NORMAL;
							 | 
						||
| 
								 | 
							
								    tok->enc = NULL;
							 | 
						||
| 
								 | 
							
								    tok->str = translated;
							 | 
						||
| 
								 | 
							
								    tok->encoding = _PyTokenizer_new_string("utf-8", 5, tok);
							 | 
						||
| 
								 | 
							
								    if (!tok->encoding) {
							 | 
						||
| 
								 | 
							
								        _PyTokenizer_Free(tok);
							 | 
						||
| 
								 | 
							
								        return NULL;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    tok->buf = tok->cur = tok->inp = translated;
							 | 
						||
| 
								 | 
							
								    tok->end = translated;
							 | 
						||
| 
								 | 
							
								    tok->underflow = &tok_underflow_string;
							 | 
						||
| 
								 | 
							
								    return tok;
							 | 
						||
| 
								 | 
							
								}
							 |