EnableExplicit Procedure.b CheckPW(pw.s) Define flag.b=#True, tmp.b=#False, c.c, s.s, i.i For c='a' To 'z' tmp=Bool(FindString(pw,Chr(c))) If tmp : Break : EndIf Next flag & tmp tmp=#False For c='A' To 'Z' tmp=Bool(FindString(pw,Chr(c))) If tmp : Break : EndIf Next flag & tmp tmp=#False For c='0' To '9' tmp=Bool(FindString(pw,Chr(c))) If tmp : Break : EndIf Next flag & tmp tmp=#False For c='!' To '/' s+Chr(c) Next For c=':' To '@' s+Chr(c) Next s+"[]^_{|}~" For i=1 To Len(pw) tmp=Bool(FindString(s,Mid(pw,i,1))) If tmp : Break : EndIf Next flag & tmp ProcedureReturn flag EndProcedure Procedure.s InputHdl(prompt.s="") Define txt.s, s.s, r.i, hlp.s Restore Help_01 Read.s hlp Print(prompt) Repeat s=Inkey() If s<>"" If FindString("0123456789",s) txt+s Print(s) EndIf If s=Chr(27) txt="0" Break EndIf ElseIf RawKey() r=RawKey() If r=112 PrintN("") PrintN(hlp) Print(~"\n"+prompt) EndIf EndIf Delay(20) Until s=Chr(13) PrintN("") ProcedureReturn txt EndProcedure NewList PasswordChar.c() Define c.c, pwlen.i, n_of_pw.i, pwstr.s, i.i For c='!' To '~' If c<>'\' And c<>'`' AddElement(PasswordChar()) : PasswordChar()=c EndIf Next OpenConsole("Password generator: F1=Help; Esc=End") Repeat pwlen=Abs(Val(InputHdl("Length of the password (n>=4): "))) If pwlen=0 : Break : EndIf If pwlen<4 : Continue : EndIf n_of_pw=Abs(Val(InputHdl("Number of passwords (n>=1): "))) If n_of_pw=0 : Break : EndIf For i=1 To n_of_pw Repeat pwstr=Mid(pwstr,2) RandomizeList(PasswordChar()) ResetList(PasswordChar()) While NextElement(PasswordChar()) pwstr+Chr(PasswordChar()) If Len(pwstr)>=pwlen : Break : EndIf Wend Until CheckPW(pwstr) PrintN(RSet(Str(i),Len(Str(n_of_pw))," ")+") "+pwstr) pwstr="" Next PrintN("") ForEver End DataSection Help_01: Data.s ~"Help: Password generator\n"+ ~"------------------------\n"+ ~"Blabla bla blabla bla blablabla.\n"+ ~"Blabla bla blablabla.\n"+ ~"Bla blabla bla blablabla bla.\n"+ ~"Blabla bla blabla bla.\n"+ ~"Bla blabla bla blablabla blablabla.\n"+ ~"Blabla bla blabla bla blablabla.\n"+ ~"Blabla blabla bla blablabla." EndOfHelp: EndDataSection