mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	* grammars: Update several grammars with compat issues * [WIP] Add new grammar conversion tools * Wrap in a Docker script * Proper Dockerfile support * Add Javadoc grammar * Remove NPM package.json * Remove superfluous test This is now always checked by the grammars compiler * Update JSyntax grammar to new submodule * Approve Javadoc license * grammars: Remove checked-in dependencies * grammars: Add regex checks to the compiler * grammars: Point Oz to its actual submodule * grammars: Refactor compiler to group errors by repo * grammars: Cleanups to error reporting
		
			
				
	
	
		
			54 lines
		
	
	
		
			1004 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1004 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package pcre
 | |
| 
 | |
| /*
 | |
| #cgo LDFLAGS: -lpcre
 | |
| #include <pcre.h>
 | |
| */
 | |
| import "C"
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| func RegexPP(re string) string {
 | |
| 	if len(re) > 32 {
 | |
| 		re = fmt.Sprintf("\"`%s`...\"", re[:32])
 | |
| 	} else {
 | |
| 		re = fmt.Sprintf("\"`%s`\"", re)
 | |
| 	}
 | |
| 	return strings.Replace(re, "\n", "", -1)
 | |
| }
 | |
| 
 | |
| type CompileError struct {
 | |
| 	Pattern string
 | |
| 	Message string
 | |
| 	Offset  int
 | |
| }
 | |
| 
 | |
| func (e *CompileError) Error() string {
 | |
| 	return fmt.Sprintf("regex %s: %s (at offset %d)",
 | |
| 		RegexPP(e.Pattern), e.Message, e.Offset)
 | |
| }
 | |
| 
 | |
| const DefaultFlags = int(C.PCRE_DUPNAMES | C.PCRE_UTF8 | C.PCRE_NEWLINE_ANYCRLF)
 | |
| 
 | |
| func CheckRegexp(pattern string, flags int) error {
 | |
| 	pattern1 := C.CString(pattern)
 | |
| 	defer C.free(unsafe.Pointer(pattern1))
 | |
| 
 | |
| 	var errptr *C.char
 | |
| 	var erroffset C.int
 | |
| 	ptr := C.pcre_compile(pattern1, C.int(flags), &errptr, &erroffset, nil)
 | |
| 	if ptr == nil {
 | |
| 		return &CompileError{
 | |
| 			Pattern: pattern,
 | |
| 			Message: C.GoString(errptr),
 | |
| 			Offset:  int(erroffset),
 | |
| 		}
 | |
| 	}
 | |
| 	C.free(unsafe.Pointer(ptr))
 | |
| 	return nil
 | |
| }
 |