2013-09-04 70 views
9

Tôi muốn biết liệu có thể chuyển GNU grep làm thư viện, bỏ qua các biến chứng hợp pháp, nếu có, vì điều này hoàn toàn là sử dụng phi thương mại, nhưng mang tính học thuật. Tôi đã thấy nhiều cổng tồn tại của GNU grep. Ví dụ: GNU grep để giành chiến thắng 32 here.Có thể chuyển GNU grep thành thư viện không?

Tôi tự hỏi tại sao không ai từng cố gắng chuyển cổng grep thành thư viện? Nó sẽ là một lợi ích to lớn cho các ứng dụng khai thác tìm kiếm/khai thác chuỗi khi chúng có thể sử dụng sức mạnh của GNU grep trong nội bộ trong các ứng dụng của chúng. Tôi muốn thử thành tích này, nhưng vì tôi mới tìm kiếm/khai thác chuỗi, rất muốn biết những thách thức rõ ràng có thể nảy sinh và tại sao nó chưa được thực hiện.

EDIT - Lợi thế của thư viện GNU grep là nó sẽ làm chuỗi tìm kiếm nhanh hơn nhiều, sử dụng phiên bản sửa đổi riêng của boyer-moore. Khi sử dụng thư viện trình bao bọc biểu thức chính quy như PCRE hoặc Boost reg exp hoặc biểu thức Qt Reg vv, ứng dụng phải đọc từng dòng một và phân tích từng dòng đối với regexp. Đây là lợi thế hiển nhiên mà tôi thấy.

+1

Không phải * chính xác * giống nhau, nhưng thay vào đó bạn đã xem [thư viện PCRE] (http://www.pcre.org/)? –

+4

Để làm cho giao diện của grep có sẵn dưới dạng lib, bạn không cần phải đi sâu vào bên trong của nó. Chủ yếu là bạn cần phải hiểu cách nó xây dựng và cách các tùy chọn dòng lệnh được ánh xạ tới các hàm cụ thể. Đã làm như vậy nó chỉ là vấn đề viết một số hàm bao và quản lý quá trình xây dựng một thư viện nói chung. Hãy tiếp tục và thử: ftp://ftp.gnu.org/gnu/grep/ – alk

+0

@AdamRosenfield, nó chắc chắn không phải là những gì tôi muốn - xem bản cập nhật. Cảm ơn, alk đây là những gì tôi muốn, tôi hy vọng nó là doable. – OverTheEdge

Trả lời

1

Có. Chỉ cần liên kết nó như một thư viện và gọi chính nó() với các đối số dự định của nó. Hoặc tốt hơn nếu bạn đổi tên chính() thành một số tốt hơn, f.e. để grep().

+3

Tôi sẽ đặt cược chính của grep() không phải là reentrant - nghĩa là những điều không vui vẻ sẽ xảy ra khi bạn gọi nó nhiều hơn một lần - có rất nhiều trạng thái từ lần chạy trước đó. – nos

+1

Bạn có quyền, tôi nghĩ rằng những vấn đề này có thể được giải quyết với việc chuyển đổi các biến toàn cầu của nó thành cục bộ. Và nếu grep thực hiện một lối ra(), nó cũng là một vấn đề. Và nếu grep không miễn phí() - s tất cả các bộ nhớ malloced của nó, sau đó thư viện này sẽ bị rò rỉ. Nhưng vấn đề này có thể được giải quyết và không có vẻ rất khó khăn, một chút chơi với mã nguồn grep dường như là không thể tránh khỏi. – peterh