RosettaCodeData/Task/Rosetta-Code-Rank-languages-by-popularity/FreeBASIC/rosetta-code-rank-languages-by-popularity.basic
2026-02-01 16:33:20 -08:00

87 lines
2.6 KiB
Text

#include "windows.bi"
#include "win/wininet.bi"
Type Category
lenguaje As String
numEntrada As Integer
End Type
Function DownloadString(url As String) As String
Const BUFFER_SIZE As Integer = 8192
Dim As HINTERNET hInternet, hConnect
Dim As String resultado
Dim As ZString * BUFFER_SIZE buffer
Dim As DWORD bytesRead
hInternet = InternetOpen("FreeBASIC", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0)
If hInternet = 0 Then Return ""
hConnect = InternetOpenUrl(hInternet, Strptr(url), NULL, 0, INTERNET_FLAG_RELOAD, 0)
If hConnect = 0 Then
InternetCloseHandle(hConnect)
Return ""
End If
Do
If InternetReadFile(hConnect, @buffer, BUFFER_SIZE - 1, @bytesRead) = 0 Then Exit Do
If bytesRead = 0 Then Exit Do
resultado &= Left(*Cast(ZString Ptr, @buffer), bytesRead)
Loop
InternetCloseHandle(hConnect)
InternetCloseHandle(hInternet)
Return resultado
End Function
Sub PrintTopCategories(url As String)
Dim As String content = DownloadString(url)
Dim As Integer startPos, endPos, numEntrada
Dim As String categoria, memberStr
Dim As Category categorias(999)
Dim As Integer cnt = 0
Dim As Integer i, j
startPos = Instr(content, "<a href=")
While startPos > 0
startPos = Instr(startPos, content, ">") + 1
endPos = Instr(startPos, content, "</a>")
categoria = Mid(content, startPos, endPos - startPos)
startPos = Instr(endPos, content, "(") + 1
endPos = Instr(startPos, content, " member")
memberStr = Mid(content, startPos, endPos - startPos)
numEntrada = 0
For i = 1 To Len(memberStr)
If Mid(memberStr, i, 1) <> "," Then
numEntrada = numEntrada * 10 + Val(Mid(memberStr, i, 1))
End If
Next i
If Left(categoria, 5) <> "Pages" Then
categorias(cnt).lenguaje = categoria
categorias(cnt).numEntrada = numEntrada
cnt += 1
End If
startPos = Instr(endPos, content, "<a href=")
Wend
' Sort categorias by numEntrada in descending order
For i = 0 To cnt - 2
For j = i + 1 To cnt - 1
If categorias(i).numEntrada < categorias(j).numEntrada Then
Swap categorias(i), categorias(j)
End If
Next j
Next i
For i = 0 To Min(cnt - 1, 14)
Print Using "Rank: ## (#### entries) &"; i + 1; categorias(i).numEntrada; categorias(i).lenguaje
Next i
End Sub
PrintTopCategories("https://rosettacode.org/wiki/Special:Categories?limit=5000")
Sleep