static inline void XXHashInsert(RefCountTable *table, RefCountBucket *insert) { objc_uinteger hash = hashObject(insert->object); objc_uinteger i = hash % table->nBuckets; if(table->count >= table->nBuckets) { objc_integer oldnBuckets = table->nBuckets; RefCountBucket **buckets = table->buckets; table->nBuckets = oldnBuckets * 2; table->buckets = calloc(table->nBuckets, sizeof(RefCountBucket *)); for(i = 0; i < oldnBuckets; i++) { RefCountBucket *check, *next; for(check = buckets[i]; check != NULL; check = next) { objc_uinteger newi = hashObject(check->object) % table->nBuckets; next = check->next; check->next = table->buckets[newi]; table->buckets[newi] = check; } } free(buckets); i = hash % table->nBuckets; } insert->next = table->buckets[i]; table->buckets[i] = insert; table->count++; }
static inline RefCountBucket *XXHashGet(RefCountTable *table, id object) { objc_uinteger i = hashObject(object) % table->nBuckets; RefCountBucket *check; for(check = table->buckets[i]; check != NULL; check = check->next) if(check->object == object) return check; return NULL; }
static inline void XXHashRemove(RefCountTable *table, RefCountBucket *remove) { objc_uinteger i = hashObject(remove->object) % table->nBuckets; RefCountBucket *check = table->buckets[i], *prev = check; for(; check != NULL; check = check->next) { if(check == remove) { if(prev == check) table->buckets[i] = check->next; else prev->next = check->next; FreeBucketFromTable(table, check); table->count--; return; } prev = check; } }
/** * Generate scez file menu slot function. */ void CreateSceFile::generateCompressedFileSlot() { bool success = false; QString sceFileName = ui->fileLineEdit->text() + "/" + QFileInfo(ui->fileLineEdit->text()).fileName() + ".sce"; ScriptFile fileHelper(this, sceFileName, false); QStringList copiedFiles; if(!isExecutableScriptInFilesTable()) { QMessageBox::information(this, "could not start generation", "No executable script defined."); return; } setEnabled(false); ui->progressBar->setValue(0); ui->progressBar->setMinimum(0); ui->progressBar->setMaximum(ui->filesTableWidget->rowCount() * 2); statusBar()->showMessage("generating scez file", 0); generateSlot(&copiedFiles, ui->progressBar, &success); if(success) { copiedFiles << sceFileName; QString zipFileName = ui->fileLineEdit->text() + ".scez"; (void)fileHelper.deleteFile(zipFileName, false); QList<QStringList> fileList; QString rootDir = QDir(QFileInfo(sceFileName).path()).absolutePath(); for(auto el : copiedFiles) { QStringList entry; entry << el; entry << QFileInfo(el).filePath().remove(0, rootDir.length() + 1); fileList << entry; } success = ScriptFile::zipFiles(zipFileName, fileList, ui->progressBar); if(!success) { (void)QFile::remove(zipFileName); } else { QFile inFile; inFile.setFileName(zipFileName); success = inFile.open(QIODevice::ReadOnly); if(success) { QCryptographicHash hashObject(QCryptographicHash::Sha512); success = hashObject.addData(&inFile); if(success) { inFile.close(); success = inFile.open(QIODevice::Append); if(success) { (void)inFile.seek(inFile.size()); QByteArray hash = hashObject.result(); success = (inFile.write(hash) == hash.length()) ? true : false; } } inFile.close(); } } } //Delete the sce folder. (void)QDir(ui->fileLineEdit->text()).removeRecursively(); if(success) { QMessageBox::information(this, "information", "scez file creation succeeded"); statusBar()->showMessage("scez file created", 5000); } else { statusBar()->showMessage("scez file creation failed", 5000); } setEnabled(true); }