FOSSology  4.4.0
Open Source License Compliance by Open Source Software
serialize.c
1 /*
2  Author: Maximilian Huber
3  SPDX-FileCopyrightText: © 2018 TNG Technology Consulting GmbH
4 
5  SPDX-License-Identifier: GPL-2.0-only
6 */
7 
8 #include "serialize.h"
9 
10 #include "monk.h"
11 #include "license.h"
12 #include "string_operations.h"
13 #include <stdio.h>
14 #include <errno.h>
15 
16 /*
17  * serialization
18  */
19 
20 int serializeToFile(Licenses* licenses, char* filename) {
21  FILE* fp = fopen(filename, "w+");
22  if (fp == NULL) {
23  return 0;
24  }
25  int retCode = serialize(licenses, fp);
26  fclose(fp);
27  return retCode;
28 }
29 
30 int serialize(Licenses* licenses, FILE* fp) {
31  return serializeGArray(licenses->licenses, fp);
32 }
33 
34 int serializeGArray(GArray* licenses, FILE* fp) {
35  int retCode;
36  for (guint i = 0; i < licenses->len; i++) {
37  retCode = serializeOne(license_index(licenses, i), fp);
38  if (retCode == 0) {
39  return retCode;
40  }
41  }
42  return 1;
43 }
44 
45 int serializeOne(License* license, FILE* fp) {
46  return serializeOneMeta(license, fp) &&
47  serializeOneShortname(license, fp) &&
48  serializeOneTokens(license->tokens, fp);
49 }
50 
51 int serializeOneMeta(License* license, FILE* fp) {
52  SerializingMeta meta = { .refId = license->refId,
53  .shortnameLen = strlen(license->shortname),
54  .tokensLen = license->tokens->len };
55 
56  return fwrite(&meta, sizeof(SerializingMeta), 1, fp) == 1;
57 }
58 
59 int serializeOneShortname(License* license, FILE* fp) {
60  return fprintf(fp, "%s", license->shortname) > 0;
61 }
62 
63 int serializeOneTokens(GArray* tokens, FILE* fp) {
64  for (guint i = 0; i < tokens->len; i++) {
65  if (fwrite(tokens_index(tokens,i), sizeof(Token), 1, fp) != 1) {
66  return 0;
67  }
68  }
69  return 1;
70 }
71 
72 /*
73  * deserialization
74  */
75 
76 Licenses* deserializeFromFile(char* filename, unsigned minAdjacentMatches, unsigned maxLeadingDiff) {
77  FILE* fp = fopen(filename, "r");
78  if(fp == NULL) {
79  exit(3);
80  }
81  Licenses* result = deserialize(fp, minAdjacentMatches, maxLeadingDiff);
82  fclose(fp);
83  return result;
84 }
85 
86 Licenses* deserialize(FILE* fp, unsigned minAdjacentMatches, unsigned maxLeadingDiff) {
87  GArray* licenses = g_array_new(TRUE, FALSE, sizeof(License));
88 
89  SerializingMeta meta;
90  while (fread(&meta, sizeof(SerializingMeta), 1, fp) == 1) {
91  License license = { .refId = meta.refId };
92 
93  license.shortname = calloc(1,(size_t) meta.shortnameLen + 1);
94  if(fread(license.shortname, sizeof(char), meta.shortnameLen, fp) != meta.shortnameLen){
95  strerror(errno);
96  }
97 
98  license.tokens = deserializeTokens(fp, meta.tokensLen);
99 
100  g_array_append_vals(licenses, &license, 1);
101  }
102 
103  return buildLicenseIndexes(licenses, minAdjacentMatches, maxLeadingDiff);
104 }
105 
106 GArray* deserializeTokens(FILE* fp, guint tokensLen) {
107  Token* freadResult = malloc(sizeof(Token) * tokensLen);
108  if(fread(freadResult, sizeof(Token), tokensLen, fp) != tokensLen){
109  strerror(errno);
110  }
111 
112  GArray* tokens = g_array_new(FALSE, FALSE, sizeof(Token));
113  g_array_append_vals(tokens,
114  freadResult,
115  tokensLen);
116  free(freadResult);
117 
118  return tokens;
119 }
Definition: monk.h:55
Definition: monk.h:67
Definition: nomos.h:426
int len
Length of pattern.
Definition: nomos.h:427