/* list the (name mtime size sum) of regular, readable files in path */ char * dirls(char *path) { char *list, *date, dig[30], buf[128]; int m, nmwid, lenwid; long i, n, ndir, len; Dir *dirbuf; if(path==nil || (ndir = ls(path, &dirbuf)) < 0) return nil; qsort(dirbuf, ndir, sizeof dirbuf[0], (int (*)(void *, void *))compare); for(nmwid=lenwid=i=0; i<ndir; i++){ if((m = strlen(dirbuf[i].name)) > nmwid) nmwid = m; snprint(buf, sizeof(buf), "%ulld", dirbuf[i].length); if((m = strlen(buf)) > lenwid) lenwid = m; } for(list=nil, len=0, i=0; i<ndir; i++){ date = ctime(dirbuf[i].mtime); date[28] = 0; // trim newline n = snprint(buf, sizeof buf, "%*ulld %s", lenwid, dirbuf[i].length, date+4); n += enc64(dig, sizeof dig, sha1file(path, dirbuf[i].name), SHA1dlen); n += nmwid+3+strlen(dirbuf[i].name); list = erealloc(list, len+n+1); len += snprint(list+len, n+1, "%-*s\t%s %s\n", nmwid, dirbuf[i].name, buf, dig); } free(dirbuf); return list; }
const wxString wxSHA1::GetDigest(bool mainthread) { if (m_isfile) { if(m_bCalculatedDigest) { const wxString szRetVal = m_pszDigestString; return szRetVal; } else if(!m_file.FileExists()) { return wxEmptyString; } else { sha1_context sha1Context; sha1_starts(&sha1Context); wxFile sha1file(m_file.GetFullPath(), wxFile::read); unsigned char buffer[16384]; unsigned int i = 1; while (i >0) { i = sha1file.Read(buffer,16384); sha1_update(&sha1Context, buffer, (unsigned) i); if (mainthread) wxYield(); } sha1_finish(&sha1Context,m_arrDigest); wxString szRetVal; unsigned int j=0; for (i = 0; i < sizeof m_arrDigest; i++) { szRetVal << wxString::Format(wxT("%02X"),m_arrDigest[i]); m_pszDigestString[j] = szRetVal.GetChar(j); m_pszDigestString[j+1] = szRetVal.GetChar(j+1); j+=2; } return szRetVal; } } else { if(m_bCalculatedDigest) { const wxString szRetVal = m_pszDigestString; return szRetVal; } else if(m_szText.IsEmpty()) { return wxEmptyString; } else { sha1_context sha1Context; sha1_starts(&sha1Context); char *text = new char[m_szText.Len()+1]; unsigned int i; for (i=0; i < (m_szText.Len());i++) text[i] = m_szText.GetChar(i); text[i] = '\0'; sha1_update(&sha1Context, (unsigned char*)(text), strlen(text)); sha1_finish(&sha1Context,m_arrDigest); wxString szRetVal; unsigned int j=0; for (i = 0; i < sizeof m_arrDigest; i++) { szRetVal << wxString::Format(wxT("%02X"),m_arrDigest[i]); m_pszDigestString[j] = szRetVal.GetChar(j); m_pszDigestString[j+1] = szRetVal.GetChar(j+1); j+=2; } return szRetVal; } } }