Her har du en maskine der søger på filnavne ....
Hvis du gerne vil ændre det til, at man søger på indeholdet, så kan du bare ændre \'grep --parameterne\'
----------------------------------------------------
open Mosmlcgi;
fun valid(c) = (ord(c) <= 122 andalso ord(c) >= 97) orelse (ord(c) <= 90 andalso ord(c) >= 65)
fun isValid([]) = true
| isValid(c::cs) = valid(c) andalso isValid(cs)
;
fun remAfterP [] = []
| remAfterP (#\".\"::cs) = []
| remAfterP (c::cs) = c::remAfterP(cs)
;
fun convertToList ([],out,result) = (rev out) :: result
| convertToList ((#\"\\n\"::in1),out,result) = convertToList(in1,[],(rev out) :: result)
| convertToList (i::in1,out,result) = convertToList(in1,i::out,result);
fun toUri ([]) = \"\"
| toUri (x::xs) =
let val myX = HelpFun.afterString(\"/home/michaelprivate/1-filer/\",implode(x))
in
\"<A HREF=\\\"
http://www.godthaab-revyen.dk/zx14q/1-filer/\" ^ myX ^ \"\\\">\" ^ myX ^ \"</A><BR>\" ^ toUri (xs)
end;
fun main () =
let
val soegOrd = UrlDecode.urldecode(HelpFun.afterString(\"ord=\",implode(HelpFun.beforeC(#\"&\",explode(valOf(Mosmlcgi.cgi_query_string))))));
val fil = \"/home/michaelprivate/TMP/soeg\" ^ implode(remAfterP(explode(Time.toString(Time.now()))));
val command = (\"ls /home/michaelprivate/www.zx14q.godthaab-revyen.dk/1-filer/* | grep -i \" ^ soegOrd ^ \" > \" ^
fil);
val validSoegOrd = isValid(explode soegOrd)
val ttt = if validSoegOrd then Process.system(command) else Process.success
val inFile = if validSoegOrd then BackUp.getBackUpFile(fil) else \"\";
val mainHTML = toUri(convertToList(explode(inFile),[],[]));
val debug = foldr op^ \"\" (map implode (convertToList(explode(inFile),[],[])));
val beginHTML = \"Content-type: text/html\\n\\n <HTML>\" ^
\"<BODY>Følgende blev fundet:\"
val HTML = if not(validSoegOrd) then \"<BR><BR>Du har ikke indtastet et valid søgeord ... <BR> Prøv igen\" else if size(inFile) < 10 then \"<BR><p>Der er ingen resultater\" else mainHTML
val endHTML = \"</FONT></BODY></HTML>\";
in
print(beginHTML ^
HTML ^ endHTML)
end
val _ = main ();
----------------------------------------------------
Nu skal du bare oversætte skidtet fra Mosml til C++ .....
Men pointen er (i sovse-stil):
char* søgOrd = URLDecode.decode(query_string);
System(grep søgOrd > enFil);
string uformateretResultat = Åben(enFil);
string pæntResultat = formater(uformateretResultat);
cout << pæntResulttat << endl;
return 0;
================================================
En URLdecoder til C++, kan du sikkert finde på nettet. Men ellers er der en her (i mosml):
fun urldecode s =
let
val sus = Substring.all s
val sz = Substring.size sus
exception Dehex;
fun dehex(ch) =
if #\"0\" <= ch andalso ch <= #\"9\"
then Char.ord(ch) - Char.ord(#\"0\")
else if #\"A\" <= ch andalso ch <= #\"F\"
then (Char.ord(ch) - Char.ord(#\"A\")) + 10
else if #\"a\" <= ch andalso ch <= #\"f\"
then (Char.ord(ch) - Char.ord(#\"a\")) + 10
else raise Dehex;
fun decode_one(i) =
Char.chr(16*dehex(Substring.sub(sus,i+1))+
dehex(Substring.sub(sus,i+2)));
fun dec(i) =
if i>=sz then []
else case Substring.sub(sus,i)
of #\"+\" => #\" \"::dec(i+1)
| #\"%\" => decode_one(i)::dec(i+3)
| ch => ch::dec(i+1);
in
String.implode(dec(0))
end handle exn => raise Fail (\"decode failed on \" ^ s ^ \"\\n\");
Okay ??