chore(package): ran fmt
							parent
							
								
									46e7e093d9
								
							
						
					
					
						commit
						e253e039c3
					
				|  | @ -4,9 +4,9 @@ | |||
| typedef struct vieter_package vieter_package; | ||||
| 
 | ||||
| typedef enum vieter_package_error { | ||||
| 	vieter_package_ok = 0, | ||||
| 	vieter_package_unarchive_error = 1, | ||||
| 	vieter_package_stat_error = 2 | ||||
|   vieter_package_ok = 0, | ||||
|   vieter_package_unarchive_error = 1, | ||||
|   vieter_package_stat_error = 2 | ||||
| } vieter_package_error; | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -17,12 +17,13 @@ vieter_package *vieter_package_init(); | |||
| /*
 | ||||
|  * Parse package file into something usable by libvieter. | ||||
|  */ | ||||
| vieter_package_error vieter_package_read_archive(vieter_package *pkg, const char *pkg_path); | ||||
| vieter_package_error vieter_package_read_archive(vieter_package *pkg, | ||||
|                                                  const char *pkg_path); | ||||
| 
 | ||||
| /*
 | ||||
|  * Deallocate a package. | ||||
|  */ | ||||
| void vieter_package_free(vieter_package ** ptp); | ||||
| void vieter_package_free(vieter_package **ptp); | ||||
| 
 | ||||
| /*
 | ||||
|  * Create string that will become the package's desc file. | ||||
|  |  | |||
|  | @ -1,245 +1,246 @@ | |||
| #include <stdlib.h> | ||||
| #include <stdbool.h> | ||||
| #include <archive.h> | ||||
| #include <archive_entry.h> | ||||
| #include <stdbool.h> | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| #include "vieter_package_internal.h" | ||||
| #include "sha256.h" | ||||
| #include "vieter_package_internal.h" | ||||
| 
 | ||||
| #define ADD_STRING(section, field) if (pkg_info->field != 0) { \ | ||||
| 	size_to_be_written = snprintf(aux, small_buff_size, section, pkg_info->field); \ | ||||
| 	if (size_to_be_written > small_buff_size) { \ | ||||
| 		aux = realloc(aux, size_to_be_written + 1); \ | ||||
| 		small_buff_size = size_to_be_written + 1; \ | ||||
| 		snprintf(aux, small_buff_size, section, pkg_info->field); \ | ||||
| 	} \ | ||||
| 	if (buff_size < strlen(description) + small_buff_size + 1) { \ | ||||
| 		description = realloc(description, buff_size * 2); \ | ||||
| 		buff_size *= 2; \ | ||||
| 	} \ | ||||
| 	strcat(description, aux); \ | ||||
| } | ||||
| #define ADD_STRING(section, field)                                             \ | ||||
|   if (pkg_info->field != 0) {                                                  \ | ||||
|     size_to_be_written =                                                       \ | ||||
|         snprintf(aux, small_buff_size, section, pkg_info->field);              \ | ||||
|     if (size_to_be_written > small_buff_size) {                                \ | ||||
|       aux = realloc(aux, size_to_be_written + 1);                              \ | ||||
|       small_buff_size = size_to_be_written + 1;                                \ | ||||
|       snprintf(aux, small_buff_size, section, pkg_info->field);                \ | ||||
|     }                                                                          \ | ||||
|     if (buff_size < strlen(description) + small_buff_size + 1) {               \ | ||||
|       description = realloc(description, buff_size * 2);                       \ | ||||
|       buff_size *= 2;                                                          \ | ||||
|     }                                                                          \ | ||||
|     strcat(description, aux);                                                  \ | ||||
|   } | ||||
| 
 | ||||
| #define ADD_ARRAY(section, field) i = 0; if (pkg_info->field != NULL) { \ | ||||
| 	ADD_STRING(section, field->array[i]); i++; \ | ||||
| 	while (pkg_info->field->array[i] != NULL) { \ | ||||
| 		ADD_STRING("\n%s", field->array[i]); i++; \ | ||||
| 	} \ | ||||
| } | ||||
| #define ADD_ARRAY(section, field)                                              \ | ||||
|   i = 0;                                                                       \ | ||||
|   if (pkg_info->field != NULL) {                                               \ | ||||
|     ADD_STRING(section, field->array[i]);                                      \ | ||||
|     i++;                                                                       \ | ||||
|     while (pkg_info->field->array[i] != NULL) {                                \ | ||||
|       ADD_STRING("\n%s", field->array[i]);                                     \ | ||||
|       i++;                                                                     \ | ||||
|     }                                                                          \ | ||||
|   } | ||||
| 
 | ||||
| static char *ignored_names[5] = { | ||||
| 	".BUILDINFO", | ||||
| 	".INSTALL", | ||||
| 	".MTREE", | ||||
| 	".PKGINFO", | ||||
| 	".CHANGELOG" | ||||
| }; | ||||
| static char *ignored_names[5] = {".BUILDINFO", ".INSTALL", ".MTREE", ".PKGINFO", | ||||
|                                  ".CHANGELOG"}; | ||||
| static size_t ignored_words_len = sizeof(ignored_names) / sizeof(char *); | ||||
| 
 | ||||
| vieter_package *vieter_package_init() { | ||||
| 	return calloc(sizeof(vieter_package_info), 1); | ||||
|   return calloc(sizeof(vieter_package_info), 1); | ||||
| } | ||||
| 
 | ||||
| vieter_package_error vieter_package_read_archive(vieter_package *pkg, const char *pkg_path) { | ||||
| 	struct archive *a = archive_read_new(); | ||||
| 	struct archive_entry *entry = archive_entry_new(); | ||||
| vieter_package_error vieter_package_read_archive(vieter_package *pkg, | ||||
|                                                  const char *pkg_path) { | ||||
|   struct archive *a = archive_read_new(); | ||||
|   struct archive_entry *entry = archive_entry_new(); | ||||
| 
 | ||||
| 	// These three are the most commonly used compression methods
 | ||||
| 	archive_read_support_filter_zstd(a); | ||||
| 	archive_read_support_filter_gzip(a); | ||||
| 	archive_read_support_filter_xz(a); | ||||
|   // These three are the most commonly used compression methods
 | ||||
|   archive_read_support_filter_zstd(a); | ||||
|   archive_read_support_filter_gzip(a); | ||||
|   archive_read_support_filter_xz(a); | ||||
| 
 | ||||
| 	// Contents should always be a tarball
 | ||||
| 	archive_read_support_format_tar(a); | ||||
|   // Contents should always be a tarball
 | ||||
|   archive_read_support_format_tar(a); | ||||
| 
 | ||||
| 	// TODO where does this 10240 come from?
 | ||||
| 	int r = archive_read_open_filename(a, pkg_path, 10240); | ||||
|   // TODO where does this 10240 come from?
 | ||||
|   int r = archive_read_open_filename(a, pkg_path, 10240); | ||||
| 
 | ||||
| 	// Exit early if we weren't able to successfully open the archive for reading
 | ||||
| 	if (r != ARCHIVE_OK) { | ||||
| 		return vieter_package_unarchive_error; | ||||
| 	} | ||||
|   // Exit early if we weren't able to successfully open the archive for reading
 | ||||
|   if (r != ARCHIVE_OK) { | ||||
|     return vieter_package_unarchive_error; | ||||
|   } | ||||
| 
 | ||||
| 	int compression_code = archive_filter_code(a, 0); | ||||
| 	const char *path_name; | ||||
|   int compression_code = archive_filter_code(a, 0); | ||||
|   const char *path_name; | ||||
| 
 | ||||
| 	vieter_package_info *pkg_info; | ||||
| 	vieter_package_dynarray *files = vieter_package_dynarray_init(16); | ||||
| 	vieter_package_dynarray_add(files, "%FILES%"); | ||||
|   vieter_package_info *pkg_info; | ||||
|   vieter_package_dynarray *files = vieter_package_dynarray_init(16); | ||||
|   vieter_package_dynarray_add(files, "%FILES%"); | ||||
| 
 | ||||
| 	while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { | ||||
| 		path_name = archive_entry_pathname(entry); | ||||
|   while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { | ||||
|     path_name = archive_entry_pathname(entry); | ||||
| 
 | ||||
| 		bool ignore = false; | ||||
|     bool ignore = false; | ||||
| 
 | ||||
| 		for (size_t i = 0; i < ignored_words_len; i++) { | ||||
| 			if (strcmp(path_name, ignored_names[i]) == 0) { | ||||
| 				ignore = true; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
|     for (size_t i = 0; i < ignored_words_len; i++) { | ||||
|       if (strcmp(path_name, ignored_names[i]) == 0) { | ||||
|         ignore = true; | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
| 		if (!ignore) { | ||||
| 			vieter_package_dynarray_add(files, path_name); | ||||
| 		} | ||||
|     if (!ignore) { | ||||
|       vieter_package_dynarray_add(files, path_name); | ||||
|     } | ||||
| 
 | ||||
| 		if (strcmp(path_name, ".PKGINFO") == 0) { | ||||
| 			// Read data of file into memory buffer
 | ||||
| 			int size = archive_entry_size(entry); | ||||
| 			char *buf = malloc(size); | ||||
| 			archive_read_data(a, buf, size); | ||||
|     if (strcmp(path_name, ".PKGINFO") == 0) { | ||||
|       // Read data of file into memory buffer
 | ||||
|       int size = archive_entry_size(entry); | ||||
|       char *buf = malloc(size); | ||||
|       archive_read_data(a, buf, size); | ||||
| 
 | ||||
| 			// Parse package vieter_package_info string into a struct
 | ||||
| 			pkg_info = vieter_package_info_init(); | ||||
| 			vieter_package_info_parse(pkg_info, buf); | ||||
|       // Parse package vieter_package_info string into a struct
 | ||||
|       pkg_info = vieter_package_info_init(); | ||||
|       vieter_package_info_parse(pkg_info, buf); | ||||
| 
 | ||||
| 			free(buf); | ||||
| 		} else { | ||||
| 			archive_read_data_skip(a); | ||||
| 		} | ||||
| 	} | ||||
|       free(buf); | ||||
|     } else { | ||||
|       archive_read_data_skip(a); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| 	// Get size of file
 | ||||
| 	struct stat stats; | ||||
|   // Get size of file
 | ||||
|   struct stat stats; | ||||
| 
 | ||||
| 	if (stat(pkg_path, &stats) != 0) { | ||||
| 		// errno is set if stat() fails; the calling function should check
 | ||||
| 		// the value of errno in case vieter_package_stat_error is returned
 | ||||
| 		return vieter_package_stat_error; | ||||
| 	} | ||||
|   if (stat(pkg_path, &stats) != 0) { | ||||
|     // errno is set if stat() fails; the calling function should check
 | ||||
|     // the value of errno in case vieter_package_stat_error is returned
 | ||||
|     return vieter_package_stat_error; | ||||
|   } | ||||
| 
 | ||||
| 	pkg_info->csize = stats.st_size; | ||||
|   pkg_info->csize = stats.st_size; | ||||
| 
 | ||||
| 	archive_read_free(a); | ||||
|   archive_read_free(a); | ||||
| 
 | ||||
| 	// Create final return value
 | ||||
| 	pkg->path = strdup(pkg_path); | ||||
| 	pkg->info = pkg_info; | ||||
| 	pkg->files = files; | ||||
| 	pkg->compression = compression_code; | ||||
|   // Create final return value
 | ||||
|   pkg->path = strdup(pkg_path); | ||||
|   pkg->info = pkg_info; | ||||
|   pkg->files = files; | ||||
|   pkg->compression = compression_code; | ||||
| 
 | ||||
| 	return vieter_package_ok; | ||||
|   return vieter_package_ok; | ||||
| } | ||||
| 
 | ||||
| void vieter_package_sha256sum(vieter_package *pkg, char *res) { | ||||
| 	FILE *f = fopen(pkg->path, "r"); | ||||
| 	// Try to read 100KiB at a time
 | ||||
| 	unsigned char *in = malloc(102400); | ||||
| 	// Actual number of bytes read
 | ||||
| 	size_t read_size; | ||||
|   FILE *f = fopen(pkg->path, "r"); | ||||
|   // Try to read 100KiB at a time
 | ||||
|   unsigned char *in = malloc(102400); | ||||
|   // Actual number of bytes read
 | ||||
|   size_t read_size; | ||||
| 
 | ||||
| 	SHA256_CTX *ctx = malloc(sizeof(SHA256_CTX)); | ||||
| 	sha256_init(ctx); | ||||
| 	while ((read_size = fread(in, 1, 102400, f)) != 0) { | ||||
| 		sha256_update(ctx, in, read_size); | ||||
| 	} | ||||
| 	unsigned char hash[SHA256_BLOCK_SIZE]; | ||||
|   SHA256_CTX *ctx = malloc(sizeof(SHA256_CTX)); | ||||
|   sha256_init(ctx); | ||||
|   while ((read_size = fread(in, 1, 102400, f)) != 0) { | ||||
|     sha256_update(ctx, in, read_size); | ||||
|   } | ||||
|   unsigned char hash[SHA256_BLOCK_SIZE]; | ||||
| 
 | ||||
| 	sha256_final(ctx, hash); | ||||
|   sha256_final(ctx, hash); | ||||
| 
 | ||||
| 	fclose(f); | ||||
| 	free(in); | ||||
| 	free(ctx); | ||||
|   fclose(f); | ||||
|   free(in); | ||||
|   free(ctx); | ||||
| 
 | ||||
| 	// We need to convert the bytes in the hash to get a string representation of its hex values
 | ||||
| 	// i.e. turn 1001 1111 into the string "9f"
 | ||||
| 	// Each byte of the hash is going to turn into two bytes in the final string
 | ||||
| 	// so we are going to convert each half byte into a char
 | ||||
| 	unsigned int half_byte = 0; | ||||
| 	int j = 0; | ||||
|   // We need to convert the bytes in the hash to get a string representation of
 | ||||
|   // its hex values i.e. turn 1001 1111 into the string "9f" Each byte of the
 | ||||
|   // hash is going to turn into two bytes in the final string so we are going to
 | ||||
|   // convert each half byte into a char
 | ||||
|   unsigned int half_byte = 0; | ||||
|   int j = 0; | ||||
| 
 | ||||
| 	// We advance 2 bytes in the string for every one byte of the hash
 | ||||
| 	for (int i = 0; i < SHA256_BLOCK_SIZE; i++) { | ||||
| 		// We transform the first half byte into the second character to keep
 | ||||
| 		// each byte from becoming reversed in the final string
 | ||||
| 		half_byte = hash[i] & 0b1111; | ||||
| 		if (half_byte < 10) { | ||||
| 			res[j+1] = half_byte + 48; | ||||
| 		} else { | ||||
| 			res[j+1] = half_byte + 87; | ||||
| 		} | ||||
| 		hash[i] = hash[i] >> 4; | ||||
| 		half_byte = hash[i] & 0b1111; | ||||
| 		if (half_byte < 10) { | ||||
| 			res[j] = half_byte + 48; | ||||
| 		} else { | ||||
| 			res[j] = half_byte + 87; | ||||
| 		} | ||||
|   // We advance 2 bytes in the string for every one byte of the hash
 | ||||
|   for (int i = 0; i < SHA256_BLOCK_SIZE; i++) { | ||||
|     // We transform the first half byte into the second character to keep
 | ||||
|     // each byte from becoming reversed in the final string
 | ||||
|     half_byte = hash[i] & 0b1111; | ||||
|     if (half_byte < 10) { | ||||
|       res[j + 1] = half_byte + 48; | ||||
|     } else { | ||||
|       res[j + 1] = half_byte + 87; | ||||
|     } | ||||
|     hash[i] = hash[i] >> 4; | ||||
|     half_byte = hash[i] & 0b1111; | ||||
|     if (half_byte < 10) { | ||||
|       res[j] = half_byte + 48; | ||||
|     } else { | ||||
|       res[j] = half_byte + 87; | ||||
|     } | ||||
| 
 | ||||
| 		j += 2; | ||||
| 	} | ||||
| 	res[j] = '\0'; | ||||
|     j += 2; | ||||
|   } | ||||
|   res[j] = '\0'; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| char *vieter_package_to_description(vieter_package *pkg) { | ||||
| 	vieter_package_info *pkg_info = pkg->info; | ||||
|   vieter_package_info *pkg_info = pkg->info; | ||||
| 
 | ||||
| 	size_t buff_size = 1024; | ||||
| 	int small_buff_size = 128; | ||||
| 	int size_to_be_written; | ||||
| 	char *aux = malloc(sizeof(char) * small_buff_size); | ||||
| 	char *description = malloc(sizeof(char) * buff_size); | ||||
| 	// Helper variable for ADD_ARRAY macro
 | ||||
| 	int i; | ||||
|   size_t buff_size = 1024; | ||||
|   int small_buff_size = 128; | ||||
|   int size_to_be_written; | ||||
|   char *aux = malloc(sizeof(char) * small_buff_size); | ||||
|   char *description = malloc(sizeof(char) * buff_size); | ||||
|   // Helper variable for ADD_ARRAY macro
 | ||||
|   int i; | ||||
| 
 | ||||
| 	// special case for FILENAME
 | ||||
| 	// assuming .pkg.tar.zst; other formats are valid, this should account for that
 | ||||
| 	size_to_be_written = snprintf(aux, small_buff_size, "%%FILENAME%%\n%s-%s-%s.pkg.tar.zst", pkg_info->name, | ||||
| 			pkg_info->version, pkg_info->arch); | ||||
|   // special case for FILENAME
 | ||||
|   // assuming .pkg.tar.zst; other formats are valid, this should account for
 | ||||
|   // that
 | ||||
|   size_to_be_written = | ||||
|       snprintf(aux, small_buff_size, "%%FILENAME%%\n%s-%s-%s.pkg.tar.zst", | ||||
|                pkg_info->name, pkg_info->version, pkg_info->arch); | ||||
| 
 | ||||
| 	// We neither want to let an arbritrarily long input to overflow the buffer
 | ||||
| 	// nor to truncate perfectly valid inputs
 | ||||
| 	if (size_to_be_written > small_buff_size) { | ||||
| 		aux = realloc(aux, size_to_be_written + 1); | ||||
| 		small_buff_size = size_to_be_written + 1; | ||||
| 		snprintf(aux, small_buff_size, "%%FILENAME%%\n%s-%s-%s.pkg.tar.zst", pkg_info->name, | ||||
| 				pkg_info->version, pkg_info->arch); | ||||
| 	} | ||||
| 	strcpy(description, aux); | ||||
|   // We neither want to let an arbritrarily long input to overflow the buffer
 | ||||
|   // nor to truncate perfectly valid inputs
 | ||||
|   if (size_to_be_written > small_buff_size) { | ||||
|     aux = realloc(aux, size_to_be_written + 1); | ||||
|     small_buff_size = size_to_be_written + 1; | ||||
|     snprintf(aux, small_buff_size, "%%FILENAME%%\n%s-%s-%s.pkg.tar.zst", | ||||
|              pkg_info->name, pkg_info->version, pkg_info->arch); | ||||
|   } | ||||
|   strcpy(description, aux); | ||||
| 
 | ||||
| 	ADD_STRING("\n\n%%NAME%%\n%s", name); | ||||
| 	ADD_STRING("\n\n%%BASE%%\n%s", base); | ||||
| 	ADD_STRING("\n\n%%VERSION%%\n%s", version); | ||||
| 	ADD_STRING("\n\n%%DESC%%\n%s", description); | ||||
| 	ADD_ARRAY("\n\n%%GROUPS%%\n%s", groups); | ||||
| 	ADD_STRING("\n\n%%CSIZE%%\n%ld", csize); | ||||
| 	ADD_STRING("\n\n%%ISIZE%%\n%ld", size); | ||||
|   ADD_STRING("\n\n%%NAME%%\n%s", name); | ||||
|   ADD_STRING("\n\n%%BASE%%\n%s", base); | ||||
|   ADD_STRING("\n\n%%VERSION%%\n%s", version); | ||||
|   ADD_STRING("\n\n%%DESC%%\n%s", description); | ||||
|   ADD_ARRAY("\n\n%%GROUPS%%\n%s", groups); | ||||
|   ADD_STRING("\n\n%%CSIZE%%\n%ld", csize); | ||||
|   ADD_STRING("\n\n%%ISIZE%%\n%ld", size); | ||||
| 
 | ||||
| 	char checksum[SHA256_BLOCK_SIZE * 2 + 1]; | ||||
| 	vieter_package_sha256sum(pkg, checksum); | ||||
|   char checksum[SHA256_BLOCK_SIZE * 2 + 1]; | ||||
|   vieter_package_sha256sum(pkg, checksum); | ||||
| 
 | ||||
| 	snprintf(aux, small_buff_size, "\n\n%%SHA256SUM%%\n%s", checksum); | ||||
| 	if (buff_size < strlen(description) + small_buff_size + 1) { | ||||
| 		description = realloc(description, buff_size * 2); | ||||
| 		buff_size *= 2; | ||||
| 	} | ||||
| 	strcat(description, aux); | ||||
|   snprintf(aux, small_buff_size, "\n\n%%SHA256SUM%%\n%s", checksum); | ||||
|   if (buff_size < strlen(description) + small_buff_size + 1) { | ||||
|     description = realloc(description, buff_size * 2); | ||||
|     buff_size *= 2; | ||||
|   } | ||||
|   strcat(description, aux); | ||||
| 
 | ||||
| 	ADD_STRING("\n\n%%URL%%\n%s", url); | ||||
| 	ADD_ARRAY("\n\n%%LICENSE%%\n%s", licenses); | ||||
| 	ADD_STRING("\n\n%%ARCH%%\n%s", arch); | ||||
| 	ADD_STRING("\n\n%%BUILDDATE%%\n%ld", build_date); | ||||
| 	ADD_STRING("\n\n%%PACKAGER%%\n%s", packager); | ||||
| 	ADD_ARRAY("\n\n%%REPLACES%%\n%s", replaces); | ||||
| 	ADD_ARRAY("\n\n%%CONFLICTS%%\n%s", conflicts); | ||||
| 	ADD_ARRAY("\n\n%%PROVIDES%%\n%s", provides); | ||||
| 	ADD_ARRAY("\n\n%%DEPENDS%%\n%s", depends); | ||||
| 	ADD_ARRAY("\n\n%%OPTDEPENDS%%\n%s", optdepends); | ||||
| 	ADD_ARRAY("\n\n%%MAKEDEPENDS%%\n%s", makedepends); | ||||
| 	ADD_ARRAY("\n\n%%CHECKDEPENDS%%\n%s", checkdepends); | ||||
|   ADD_STRING("\n\n%%URL%%\n%s", url); | ||||
|   ADD_ARRAY("\n\n%%LICENSE%%\n%s", licenses); | ||||
|   ADD_STRING("\n\n%%ARCH%%\n%s", arch); | ||||
|   ADD_STRING("\n\n%%BUILDDATE%%\n%ld", build_date); | ||||
|   ADD_STRING("\n\n%%PACKAGER%%\n%s", packager); | ||||
|   ADD_ARRAY("\n\n%%REPLACES%%\n%s", replaces); | ||||
|   ADD_ARRAY("\n\n%%CONFLICTS%%\n%s", conflicts); | ||||
|   ADD_ARRAY("\n\n%%PROVIDES%%\n%s", provides); | ||||
|   ADD_ARRAY("\n\n%%DEPENDS%%\n%s", depends); | ||||
|   ADD_ARRAY("\n\n%%OPTDEPENDS%%\n%s", optdepends); | ||||
|   ADD_ARRAY("\n\n%%MAKEDEPENDS%%\n%s", makedepends); | ||||
|   ADD_ARRAY("\n\n%%CHECKDEPENDS%%\n%s", checkdepends); | ||||
| 
 | ||||
| 	strcat(description, "\n\n"); | ||||
|   strcat(description, "\n\n"); | ||||
| 
 | ||||
| 	return description; | ||||
|   return description; | ||||
| } | ||||
| 
 | ||||
| void vieter_package_free(vieter_package **ptp) { | ||||
| 	FREE_STRING((*ptp)->path); | ||||
| 	vieter_package_info_free((*ptp)->info); | ||||
| 	vieter_package_dynarray_free((*ptp)->files); | ||||
| 	free(*ptp); | ||||
| 	*ptp = NULL; | ||||
| 
 | ||||
|   FREE_STRING((*ptp)->path); | ||||
|   vieter_package_info_free((*ptp)->info); | ||||
|   vieter_package_dynarray_free((*ptp)->files); | ||||
|   free(*ptp); | ||||
|   *ptp = NULL; | ||||
| } | ||||
|  |  | |||
|  | @ -1,56 +1,58 @@ | |||
| #include "vieter_package_dynarray.h" | ||||
| 
 | ||||
| vieter_package_dynarray *vieter_package_dynarray_init(size_t initial_capacity) { | ||||
| 	vieter_package_dynarray *da = malloc(sizeof(vieter_package_dynarray)); | ||||
| 	da->size = 0; | ||||
| 	da->capacity = initial_capacity; | ||||
|   vieter_package_dynarray *da = malloc(sizeof(vieter_package_dynarray)); | ||||
|   da->size = 0; | ||||
|   da->capacity = initial_capacity; | ||||
| 
 | ||||
| 	return da; | ||||
|   return da; | ||||
| } | ||||
| 
 | ||||
| void vieter_package_dynarray_add(vieter_package_dynarray *da, const char *s) { | ||||
| 	// An empty vieter_package_dynarray does not have an allocated internal array yet
 | ||||
| 	if (da->size == 0) { | ||||
| 		da->array = malloc(sizeof(char*) * da->capacity); | ||||
|   // An empty vieter_package_dynarray does not have an allocated internal array
 | ||||
|   // yet
 | ||||
|   if (da->size == 0) { | ||||
|     da->array = malloc(sizeof(char *) * da->capacity); | ||||
| 
 | ||||
| 		// Initialise all char*'s to 0 so array[i] == NULL can be used to see if field is empty
 | ||||
| 		memset(da->array, 0, sizeof(char*) * da->capacity); | ||||
| 	} | ||||
| 	// Double array size if it's full
 | ||||
| 	else if (da->size == da->capacity) { | ||||
| 		// if the realloc fails, access to memory in da->array is lost
 | ||||
| 		da->array = realloc(da->array, sizeof(char*) * da->capacity * 2); | ||||
| 		da->capacity *= 2; | ||||
|     // Initialise all char*'s to 0 so array[i] == NULL can be used to see if
 | ||||
|     // field is empty
 | ||||
|     memset(da->array, 0, sizeof(char *) * da->capacity); | ||||
|   } | ||||
|   // Double array size if it's full
 | ||||
|   else if (da->size == da->capacity) { | ||||
|     // if the realloc fails, access to memory in da->array is lost
 | ||||
|     da->array = realloc(da->array, sizeof(char *) * da->capacity * 2); | ||||
|     da->capacity *= 2; | ||||
| 
 | ||||
| 		// Same as the previous memset, but only for newly allocated pointers
 | ||||
| 		memset(da->array + da->size, 0, sizeof(char*) * da->capacity / 2); | ||||
| 	} | ||||
| 	 | ||||
| 	da->array[da->size] = strdup(s); | ||||
| 	da->size++; | ||||
|     // Same as the previous memset, but only for newly allocated pointers
 | ||||
|     memset(da->array + da->size, 0, sizeof(char *) * da->capacity / 2); | ||||
|   } | ||||
| 
 | ||||
|   da->array[da->size] = strdup(s); | ||||
|   da->size++; | ||||
| } | ||||
| 
 | ||||
| void vieter_package_dynarray_free(vieter_package_dynarray *da) { | ||||
| 	if (da == NULL) { | ||||
| 		return; | ||||
| 	} | ||||
|   if (da == NULL) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
| 	if (da->array != NULL) { | ||||
| 		for (size_t i = 0; i < da->size; i++) { | ||||
| 			free(da->array[i]); | ||||
| 		} | ||||
|   if (da->array != NULL) { | ||||
|     for (size_t i = 0; i < da->size; i++) { | ||||
|       free(da->array[i]); | ||||
|     } | ||||
| 
 | ||||
| 		free(da->array); | ||||
| 	} | ||||
|     free(da->array); | ||||
|   } | ||||
| 
 | ||||
| 	free(da); | ||||
|   free(da); | ||||
| } | ||||
| 
 | ||||
| char **vieter_package_dynarray_convert(vieter_package_dynarray *da) { | ||||
| 	char **array = da->array; | ||||
|   char **array = da->array; | ||||
| 
 | ||||
| 	da->array = NULL; | ||||
| 	vieter_package_dynarray_free(da); | ||||
|   da->array = NULL; | ||||
|   vieter_package_dynarray_free(da); | ||||
| 
 | ||||
| 	return array; | ||||
|   return array; | ||||
| } | ||||
|  |  | |||
|  | @ -2,78 +2,85 @@ | |||
| 
 | ||||
| #include "vieter_package_info.h" | ||||
| 
 | ||||
| #define PKG_INFO_STRING(key_ptr, field) if ((value_ptr = strstr(value_ptr, key_ptr)) != NULL) { \ | ||||
| 	value_ptr += strlen(key_ptr);\ | ||||
| 	tail_ptr = strchr(value_ptr, '\n');\ | ||||
| 	tail_ptr[0] = '\0'; \ | ||||
| 	pkg_info->field = strdup(value_ptr); \ | ||||
| 	tail_ptr[0] = '\n'; \ | ||||
| } value_ptr = tail_ptr; | ||||
| #define PKG_INFO_STRING(key_ptr, field)                                        \ | ||||
|   if ((value_ptr = strstr(value_ptr, key_ptr)) != NULL) {                      \ | ||||
|     value_ptr += strlen(key_ptr);                                              \ | ||||
|     tail_ptr = strchr(value_ptr, '\n');                                        \ | ||||
|     tail_ptr[0] = '\0';                                                        \ | ||||
|     pkg_info->field = strdup(value_ptr);                                       \ | ||||
|     tail_ptr[0] = '\n';                                                        \ | ||||
|   }                                                                            \ | ||||
|   value_ptr = tail_ptr; | ||||
| 
 | ||||
| #define PKG_INFO_INT(key_ptr, field) value_ptr = strstr(value_ptr, key_ptr) + strlen(key_ptr);\ | ||||
| 									tail_ptr = strchr(value_ptr, '\n');\ | ||||
| 									tail_ptr[0] = '\0'; \ | ||||
| 									pkg_info->field = atoi(value_ptr); \ | ||||
| 									tail_ptr[0] = '\n'; \ | ||||
| 									value_ptr = tail_ptr; | ||||
| #define PKG_INFO_INT(key_ptr, field)                                           \ | ||||
|   value_ptr = strstr(value_ptr, key_ptr) + strlen(key_ptr);                    \ | ||||
|   tail_ptr = strchr(value_ptr, '\n');                                          \ | ||||
|   tail_ptr[0] = '\0';                                                          \ | ||||
|   pkg_info->field = atoi(value_ptr);                                           \ | ||||
|   tail_ptr[0] = '\n';                                                          \ | ||||
|   value_ptr = tail_ptr; | ||||
| 
 | ||||
| #define PKG_INFO_ARRAY(key_ptr, field) while((value_ptr = strstr(value_ptr, key_ptr)) != NULL){ \ | ||||
| 	value_ptr = value_ptr + strlen(key_ptr);\ | ||||
| 	tail_ptr = strchr(value_ptr, '\n'); \ | ||||
| 	tail_ptr[0] = '\0'; \ | ||||
| 	if(pkg_info->field == NULL) { pkg_info->field = vieter_package_dynarray_init(4); } \ | ||||
| 	vieter_package_dynarray_add(pkg_info->field, value_ptr); \ | ||||
| 	tail_ptr[0] = '\n'; \ | ||||
| 	value_ptr = tail_ptr;\ | ||||
| } value_ptr = tail_ptr; | ||||
| #define PKG_INFO_ARRAY(key_ptr, field)                                         \ | ||||
|   while ((value_ptr = strstr(value_ptr, key_ptr)) != NULL) {                   \ | ||||
|     value_ptr = value_ptr + strlen(key_ptr);                                   \ | ||||
|     tail_ptr = strchr(value_ptr, '\n');                                        \ | ||||
|     tail_ptr[0] = '\0';                                                        \ | ||||
|     if (pkg_info->field == NULL) {                                             \ | ||||
|       pkg_info->field = vieter_package_dynarray_init(4);                       \ | ||||
|     }                                                                          \ | ||||
|     vieter_package_dynarray_add(pkg_info->field, value_ptr);                   \ | ||||
|     tail_ptr[0] = '\n';                                                        \ | ||||
|     value_ptr = tail_ptr;                                                      \ | ||||
|   }                                                                            \ | ||||
|   value_ptr = tail_ptr; | ||||
| 
 | ||||
| vieter_package_info *vieter_package_info_init() { | ||||
| 	return calloc(1, sizeof(vieter_package_info)); | ||||
|   return calloc(1, sizeof(vieter_package_info)); | ||||
| } | ||||
| 
 | ||||
| void vieter_package_info_free(vieter_package_info *pkg_info) { | ||||
| 	FREE_STRING(pkg_info->name); | ||||
| 	FREE_STRING(pkg_info->base); | ||||
| 	FREE_STRING(pkg_info->version); | ||||
| 	FREE_STRING(pkg_info->description); | ||||
| 	FREE_STRING(pkg_info->url); | ||||
| 	FREE_STRING(pkg_info->arch); | ||||
| 	FREE_STRING(pkg_info->packager); | ||||
| 	FREE_STRING(pkg_info->pgpsig); | ||||
|   FREE_STRING(pkg_info->name); | ||||
|   FREE_STRING(pkg_info->base); | ||||
|   FREE_STRING(pkg_info->version); | ||||
|   FREE_STRING(pkg_info->description); | ||||
|   FREE_STRING(pkg_info->url); | ||||
|   FREE_STRING(pkg_info->arch); | ||||
|   FREE_STRING(pkg_info->packager); | ||||
|   FREE_STRING(pkg_info->pgpsig); | ||||
| 
 | ||||
| 	vieter_package_dynarray_free(pkg_info->groups); | ||||
| 	vieter_package_dynarray_free(pkg_info->licenses); | ||||
| 	vieter_package_dynarray_free(pkg_info->replaces); | ||||
| 	vieter_package_dynarray_free(pkg_info->depends); | ||||
| 	vieter_package_dynarray_free(pkg_info->conflicts); | ||||
| 	vieter_package_dynarray_free(pkg_info->provides); | ||||
| 	vieter_package_dynarray_free(pkg_info->optdepends); | ||||
| 	vieter_package_dynarray_free(pkg_info->makedepends); | ||||
| 	vieter_package_dynarray_free(pkg_info->checkdepends); | ||||
|   vieter_package_dynarray_free(pkg_info->groups); | ||||
|   vieter_package_dynarray_free(pkg_info->licenses); | ||||
|   vieter_package_dynarray_free(pkg_info->replaces); | ||||
|   vieter_package_dynarray_free(pkg_info->depends); | ||||
|   vieter_package_dynarray_free(pkg_info->conflicts); | ||||
|   vieter_package_dynarray_free(pkg_info->provides); | ||||
|   vieter_package_dynarray_free(pkg_info->optdepends); | ||||
|   vieter_package_dynarray_free(pkg_info->makedepends); | ||||
|   vieter_package_dynarray_free(pkg_info->checkdepends); | ||||
| 
 | ||||
| 	free(pkg_info); | ||||
|   free(pkg_info); | ||||
| } | ||||
| 
 | ||||
| void vieter_package_info_parse(vieter_package_info *pkg_info, char *pkg_info_str) { | ||||
| 	char *value_ptr = pkg_info_str, *tail_ptr; | ||||
| 
 | ||||
| 	PKG_INFO_STRING("\npkgname = ", name); | ||||
| 	PKG_INFO_STRING("\npkgbase = ", base); | ||||
| 	PKG_INFO_STRING("\npkgver = ", version); | ||||
| 	PKG_INFO_STRING("\npkgdesc = ", description); | ||||
| 	PKG_INFO_STRING("\nurl = ", url); | ||||
| 	PKG_INFO_INT("\nbuilddate = ", build_date); | ||||
| 	PKG_INFO_STRING("\npackager = ", packager); | ||||
| 	PKG_INFO_INT("\nsize = ", size); | ||||
| 	PKG_INFO_STRING("\narch = ", arch); | ||||
| 	PKG_INFO_ARRAY("\nlicense = ", licenses); | ||||
| 	PKG_INFO_ARRAY("\nreplaces = ", replaces); | ||||
| 	PKG_INFO_ARRAY("\ngroup = ", groups); | ||||
| 	PKG_INFO_ARRAY("\nconflict = ", conflicts); | ||||
| 	PKG_INFO_ARRAY("\nprovides = ", provides); | ||||
| 	PKG_INFO_ARRAY("\ndepend = ", depends); | ||||
| 	PKG_INFO_ARRAY("\noptdepend = ", optdepends); | ||||
| 	PKG_INFO_ARRAY("\nmakedepend = ", makedepends); | ||||
| 	PKG_INFO_ARRAY("\ncheckdepend = ", checkdepends); | ||||
| void vieter_package_info_parse(vieter_package_info *pkg_info, | ||||
|                                char *pkg_info_str) { | ||||
|   char *value_ptr = pkg_info_str, *tail_ptr; | ||||
| 
 | ||||
|   PKG_INFO_STRING("\npkgname = ", name); | ||||
|   PKG_INFO_STRING("\npkgbase = ", base); | ||||
|   PKG_INFO_STRING("\npkgver = ", version); | ||||
|   PKG_INFO_STRING("\npkgdesc = ", description); | ||||
|   PKG_INFO_STRING("\nurl = ", url); | ||||
|   PKG_INFO_INT("\nbuilddate = ", build_date); | ||||
|   PKG_INFO_STRING("\npackager = ", packager); | ||||
|   PKG_INFO_INT("\nsize = ", size); | ||||
|   PKG_INFO_STRING("\narch = ", arch); | ||||
|   PKG_INFO_ARRAY("\nlicense = ", licenses); | ||||
|   PKG_INFO_ARRAY("\nreplaces = ", replaces); | ||||
|   PKG_INFO_ARRAY("\ngroup = ", groups); | ||||
|   PKG_INFO_ARRAY("\nconflict = ", conflicts); | ||||
|   PKG_INFO_ARRAY("\nprovides = ", provides); | ||||
|   PKG_INFO_ARRAY("\ndepend = ", depends); | ||||
|   PKG_INFO_ARRAY("\noptdepend = ", optdepends); | ||||
|   PKG_INFO_ARRAY("\nmakedepend = ", makedepends); | ||||
|   PKG_INFO_ARRAY("\ncheckdepend = ", checkdepends); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue