FOSSology  4.6.0
Open Source License Compliance by Open Source Software
parse.c
Go to the documentation of this file.
1 /*
2  SPDX-FileCopyrightText: © 2006-2015 Hewlett-Packard Development Company, L.P.
3  SPDX-FileCopyrightText: © 2017-2019 Bittium Wireless Ltd.
4 
5  SPDX-License-Identifier: GPL-2.0-only
6 */
7 /* Equivalent to version 1.83 of Core Nomos code. */
8 #include <ctype.h>
9 
10 #include "nomos.h"
11 
12 #include "parse.h"
13 #include "list.h"
14 #include "util.h"
15 #include "nomos_regex.h"
16 #include "nomos_utils.h"
17 #include <_autodefs.h>
18 
19 /* DEBUG
20 #define DOCTOR_DEBUG 1
21 #define PROC_TRACE 1
22  DEBUG */
23 
40 #define _mGPL 0
41 #define _mLGPL 1
42 #define _mGFDL 2
43 #define _mQPL 3
44 #define _mPYTHON 4
45 #define _mPYTH_TEXT 5
46 #define _mAPACHE 6
47 #define _mHP 7
48 #define _mPHP 8
49 #define _mMIT 9
50 #define _mXOPEN 10
51 #define _mREDHAT 11
52 #define _mISC 12
53 #define _mCMU 13
54 #define _mOSF 14
55 #define _mSUN 15
56 #define _mALADDIN 16
57 #define _mCUPS 17
58 #define _fOPENLDAP 18
59 #define _fBSD 19
60 #define _fGPL 20
61 #define _mCDDL 21
62 #define _mLIBRE 22
63 #define _mGSOAP 23
64 #define _mMPL 24
65 #define _fATTRIB 25
66 #define _fREAL 26
67 #define _fIETF 27
68 #define _fDOC 28
69 #define _fMSCORP 29
70 #define _fW3C 30
71 #define _mAPTANA 31
72 #define _tOPENLDAP 32
73 #define _mNTP 33 // To avoid W3C-style detection
74 #define _fIP 34
75 #define _fANTLR 35
76 #define _fCCBY 36
77 #define _fZPL 37
78 #define _fCLA 38
79 #define _fODBL 39
80 #define _fPDDL 40
81 #define _fRUBY 41
82 #define _fSAX 42
83 #define _fAPL 43
84 #define _fARTISTIC 44
85 #define _fCITRIX 45
86 #define _fPURDUE 46
87 #define _fUNICODE 47
88 #define _fOFL 48
89 #define _mAPACHE10 49
90 #define _mAPACHE11 50
91 #define _mWORDNET 51
92 #define _fNCSA 52
93 #define _fTCL 53
94 #define _fIJG 54
95 #define _msize _fIJG+1
97 
101 static struct {
102  char *base;
103  int sso;
104  int seo;
105  int index;
107 
108 
109 #ifdef PRECHECK
110 extern void preloadResults(char *filetext, char *ltsr);
111 #endif /* PRECHECK */
112 
118 int findPhrase(int, char *,int, int, int, int);
119 int famOPENLDAP(char *, int ,int, int);
120 int checkUnclassified(char *, int, int, int, int, int);
121 int checkPublicDomain(char *, int, int, int, int, int);
122 static int dbgIdxGrep(int, char *, int);
123 #ifdef LTSR_DEBUG
124 void showLTCache(char *);
125 #endif /* LTSR_DEBUG */
126 void checkCornerCases(char *, int, int, int, int, int, int, int);
127 void checkFileReferences(char *, int, int, int, int, int);
128 void addRef(char *, int);
129 #ifdef DOCTOR_DEBUG
130 void dumpMatch(char *, char *);
131 #endif /* DOCTOR_DEBUG */
132 void locateRegex(char *, item_t *, int, int, int, int);
133 void saveRegexLocation(int, int, int, int);
134 void saveUnclBufLocation(int);
135 void saveLicenseParagraph(char *, int , int , int);
136 char *cplVersion(char *, int, int, int);
137 static char *gplVersion(char *, int, int, int);
138 char *lgplVersion(char *, int, int, int);
139 char *agplVersion(char *, int, int, int);
140 char *gfdlVersion(char *, int, int, int);
141 char *lpplVersion(char *, int, int, int);
142 char *mplNplVersion(char *, int, int, int);
143 char *pythonVersion(char *, int, int, int);
144 static char *realVersion(char *, int, int, int, int);
145 static char *sisslVersion(char *, int, int, int);
146 char *aslVersion(char *, int, int, int);
147 char *cddlVersion(char *, int, int, int);
148 char *ccVersion(char *, int, int, int);
149 char *oslVersion(char *, int, int, int);
150 char *aflVersion(char *, int, int, int);
151 static int match3(int, char *, int, int, int, int);
152 void spdxReference(char *, int, int, int);
153 void copyleftExceptions(char *, int, int, int);
155 
164 static char licStr[myBUFSIZ];
165 
166 static char ltsr[NFOOTPRINTS];
168 static char name[256];
169 static char lmem[_msize];
170 static list_t searchList;
171 static list_t whereList;
172 static list_t whCacheList;
173 static int refOffset;
174 static int maxInterest;
175 static int pd;
177 static int crCheck;
178 static int checknw;
179 static int lDebug = 0;
180 static int lDiags = 0;
182 
188 #define PARSE_ARGS filetext, size, isML, isPS
189 #define LVAL(x) (ltsr[x] & LTSR_RMASK)
190 #define SEEN(x) (ltsr[x] & LTSR_SMASK)
191 #define INFILE(x) fileHasPatt(x, PARSE_ARGS, 0)
192 #define NOT_INFILE(x) !( fileHasPatt(x, PARSE_ARGS, 0) && clearLastElementOfLicenceBuffer() )
193 #define RM_INFILE(x) fileHasPatt(x, PARSE_ARGS, 1)
194 #define GPL_INFILE(x) fileHasPatt(x, PARSE_ARGS, 2)
195 #define PERL_INFILE(x) fileHasPatt(x, PARSE_ARGS, 3)
196 #define NY_INFILE(x) fileHasPatt(x, PARSE_ARGS, 4)
197 #define X_INFILE(x, y) fileHasPatt(x, PARSE_ARGS, y)
198 #define DEBUG_INFILE(x) printf(" Regex[%d] = \"%s\"\nINFILE(%d) = %d\n", x, _REGEX(x), x, INFILE(x));
199 #define HASREGEX(x, cp) idxGrep(x, cp, REG_ICASE|REG_EXTENDED)
200 #define HASREGEX_RI(x, cp) idxGrep_recordIndex(x, cp, REG_ICASE|REG_EXTENDED)
201 #define HASTEXT(x, fl) idxGrep_recordIndex(x, filetext, REG_ICASE|fl)
202 #define URL_INFILE(x) (INFILE(x) || fileHasPatt(x, PARSE_ARGS, -1))
203 #define CANSKIP(i,x,y,z) ((i >= y) && (i <= z) && !(kwbm & (1 << (x - _KW_first))))
204 #define HASKW(x, y) (x & (1 << (y - _KW_first)))
205 #define TRYGROUP(x) x(PARSE_ARGS)
206 #define LOWINTEREST(x) addRef(x, IL_LOW)
207 #define MEDINTEREST(x) addRef(x, IL_MED)
208 //#define INTERESTING(x) printf("INTERESTING: %s, %d, %s\n", __FILE__, __LINE__, x);addRef(x, IL_HIGH)
209 #define INTERESTING(x) addRef(x, IL_HIGH)
210 #define ASLVERS() aslVersion(PARSE_ARGS)
211 #define CCVERS() ccVersion(PARSE_ARGS)
212 #define AFLVERS() aflVersion(PARSE_ARGS)
213 #define OSLVERS() oslVersion(PARSE_ARGS)
214 #define CPLVERS() cplVersion(PARSE_ARGS)
215 #define GPLVERS() gplVersion(PARSE_ARGS)
216 #define LGPLVERS() lgplVersion(PARSE_ARGS)
217 #define AGPLVERS() agplVersion(PARSE_ARGS)
218 #define GFDLVERS() gfdlVersion(PARSE_ARGS)
219 #define CDDLVERS() cddlVersion(PARSE_ARGS)
220 #define LPPLVERS() lpplVersion(PARSE_ARGS)
221 #define MPLVERS() mplNplVersion(PARSE_ARGS)
222 #define PYTHVERS() pythonVersion(PARSE_ARGS)
223 #define SISSLVERS() sisslVersion(PARSE_ARGS)
224 #define REALVERS(x) realVersion(PARSE_ARGS, x)
225 #define PR_REGEX(x) printf("check %d = %s\n", x, _REGEX(x));
226 #define mCR_CMU() (INFILE(_CR_CMU_1) || INFILE(_CR_CMU_2))
227 #define mCR_EDIN() (INFILE(_CR_EDINBURGH_1) || INFILE(_CR_EDINBURGH_2))
228 #define mCR_FSF() (INFILE(_CR_FSF1) || INFILE(_CR_FSF2))
229 #define mCR_HP() (INFILE(_CR_HP_1)|| INFILE(_CR_HP_2) || INFILE(_CR_DEC) || INFILE(_CR_EDS))
230 #define mCR_IETF() (INFILE(_CR_IETF_1) || INFILE(_CR_IETF_2))
231 #define mCR_MIT() (INFILE(_CR_MIT1) || INFILE(_CR_MIT2))
232 #define mCR_X11() (INFILE(_CR_X11) || INFILE(_CR_XFREE86))
233 #define mCR_IPTC() (INFILE(_CR_IPTC1) || INFILE(_CR_IPTC2))
234 #define SPDXREF() spdxReference(PARSE_ARGS)
235 #define EXCEPTIONS() copyleftExceptions(PARSE_ARGS)
237 
248 static int fileHasPatt(int licTextIdx, char *filetext, int size,
249  int isML, int isPS, int qType)
250 {
251  int ret = 0;
252  int show = 0;
253  item_t *ip;
254 
255 #ifdef PROC_TRACE
256  traceFunc("== fileHasPatt(size=%d, isML=%d, isPS=%d, qType=%d, idx=%d)\n",
257  size, isML, isPS, qType, licTextIdx);
258 
259 #endif /* PROC_TRACE */
260 
261  /*
262  * If qType is negative, then we should call idxGrep to look at the
263  * raw text of the file; non-negative value means look in the doctored
264  * text buffers...
265  */
266  if ((qType >= 0) && (qType & FL_SHOWMATCH)) {
267  qType &= ~FL_SHOWMATCH;
268  show = FL_SHOWMATCH;
269  }
270  if (qType < 0) {
271  ret = idxGrep_recordPosition(licTextIdx, filetext, REG_ICASE | REG_EXTENDED | show);
272  if (lDiags && ret) {
273 #ifdef DOCTOR_DEBUG
274  dumpMatch(filetext, "RAW-Text");
275 #endif /* DEBUG */
276  printRegexMatch(licTextIdx, NO);
277  saveRegexLocation(licTextIdx, cur.regm.rm_so,
278  cur.regm.rm_eo - cur.regm.rm_so, YES);
279 #ifdef DEBUG
280  printf("WINDOW-RAW: offset %d, length %d\n",
281  cur.regm.rm_so, cur.regm.rm_eo - cur.regm.rm_so);
282 #endif /* DEBUG */
283  }
284  return(ret);
285  }
286  if (SEEN(licTextIdx)) {
287 #ifdef LTSR_DEBUG
288  printf("Cache hit: ltsr[%d] = 0x%x\n", licTextIdx, ltsr[licTextIdx]);
289 #endif /* LTSR_DEBUG */
290  if (lDiags && (ltsr[licTextIdx] & LTSR_YES) == LTSR_YES) {
291  printRegexMatch(licTextIdx, YES);
292  (void) sprintf(name, "reg%04d", licTextIdx);
293  ip = listGetItem(&whCacheList, name);
294  if (ip->bIndex != licTextIdx) {
295  listDump(&whCacheList, NO);
296  LOG_FATAL("Offset-cache (\"%s\") == %d, not %d!", name, ip->bIndex, licTextIdx)
297  Bail(-__LINE__);
298  }
299  saveRegexLocation(licTextIdx, ip->bStart, ip->bLen, NO);
300  }
301  return(ltsr[licTextIdx] & LTSR_RMASK);
302  }
303  return(findPhrase(licTextIdx, PARSE_ARGS, qType));
304 }
305 
316 static int dbgIdxGrep(int licTextIdx, char *buf, int show)
317 {
318  int ret;
319  int flags = REG_ICASE|REG_EXTENDED;
320 
321  if (SEEN(licTextIdx)) {
322  return(ltsr[licTextIdx] & LTSR_RMASK);
323  }
324 
325  if (show) {
326  flags |= FL_SHOWMATCH;
327  }
328  ret = idxGrep(licTextIdx, buf, flags);
329  if (lDiags && ret) {
330  printRegexMatch(licTextIdx, NO);
331  saveRegexLocation(licTextIdx, cur.regm.rm_so,
332  cur.regm.rm_eo - cur.regm.rm_so, YES);
333  }
334  ltsr[licTextIdx] |= ret;
335  return ret;
336 }
337 
359 char *parseLicenses(char *filetext, int size, scanres_t *scp,
360  int isML, int isPS)
361 {
362  static int first = 1;
363  char *cp;
364  int i;
365  int j;
366  int nw = 0;
367  int score = scp->score;
368  int kwbm = scp->kwbm;
369 #ifdef PRECHECK
370  extern void preloadResults(char *, char *);
371 #endif /* PRECHECK */
372 
373 #if defined(PROC_TRACE) || defined(DOCTOR_DEBUG)
374  traceFunc("== parseLicenses(%p, %d, [%d, 0x%x], %d, %d)\n",
375  filetext, size, score, kwbm, isML, isPS );
376 #endif /* PROC_TRACE || DOCTOR_DEBUG */
377 
378  if (size == 0) {
379  LOWINTEREST("Empty-file-no-data!");
380  return(licStr+1);
381  }
382 
383  if (first) {
384  if (optionIsSet(OPTS_DEBUG)) {
385  lDebug = 1;
386  lDiags = 1;
387  }
388  listInit(&searchList, 0, "pattern-search list");
389  listInit(&whereList, 0, "regex-match locations list");
390  listInit(&whCacheList, 0, "regex-cache-match list");
391  first = 0;
392  }
393  crCheck = 0;
394  kludge.base = NULL_STR;
395  /*
396  * Interestingly enough, the headers for Nomos-generated file (e.g., the
397  * page containing the keywords found, file attributes and file text, etc.)
398  * contain enough data to confuse the parser in multiple ways... in the
399  * rare event we encounter a data file we generated, skip the header.
400  *****
401  * AND, not all nomos-created files have the same header(s).
402  */
403  pd = -1; /* unchecked */
404  cp = filetext;
405  maxInterest = IL_INIT;
406  cur.licPara = NULL_STR; /* unclassified license data */
407  gl.flags &= ~FL_FRAGMENT;
408 #ifdef FLAG_NO_COPYRIGHT
409  gl.flags &= ~FL_NOCOPYRIGHT;
410 #endif /* FLAG_NO_COPYRIGHT */
411  if (scp->dataOffset && lDiags) {
412  LOG_NOTICE("%s-generated link, ignore header (%d bytes)!",
413  gl.progName, scp->dataOffset);
414  }
415 
416  /*
417  * It's been observed over time that the file-magic() stuff doesn't always
418  * identify everything correctly. One case in particular is PostScript files
419  * when the "%%PS" directive isn't the first line in a file... but the rest
420  * of the data really IS PostScript
421  */
422  if (!isPS && (strncasecmp(filetext, "%%page:", 7) == 0 || strncasecmp(filetext, "{\\rtf", 5) == 0)) {
423 #if defined(DEBUG) || defined(DOCTOR_DEBUG)
424  printf("File is really postscript, %s filetext !\n", filetext);
425 #endif /* DEBUG || DOCTOR_DEBUG */
426  isPS = 1;
427  }
428 
429  *licStr = NULL_CHAR;
430  refOffset = 0;
431  (void) memset(ltsr, 0, sizeof(ltsr));
432  (void) memset(lmem, 0, sizeof(lmem));
433 #if defined(DEBUG) && defined(LTSR_DEBUG)
434  showLTCache("LTSR-results START:");
435 #endif /* DEBUG && LTSR_DEBUG */
436 #ifdef PRECHECK
437  preloadResults(/*PARSE_ARGS*/filetext, ltsr);
438 #endif /* PRECHECK */
439 #ifdef MEMSTATS
440  memStats("parseLicenses: BOP");
441 #endif /* MEMSTATS */
442  lmem[_mPYTH_TEXT] = HASTEXT(_TEXT_PYTHON, 0);
443  lmem[_tOPENLDAP] = HASTEXT(_TEXT_OPENLDAP, 0);
444  (void) INFILE(_TEXT_GNU_LIC_INFO);
445 #ifdef LTSR_DEBUG
446  showLTCache("LTSR-results INIT-SCAN:");
447 #endif /* LTSR_DEBUG */
448  /*
449  * MySQL.FLOSS exception
450  */
451  if (INFILE(_LT_MYSQL_EXCEPT) || INFILE(_PHR_FREE_LIBRE)) {
452  if (INFILE(_TITLE_ALFRESCO)) {
453  INTERESTING("Alfresco-FLOSS");
454  }
455  else if (HASTEXT(_TEXT_ALFRESCO, 0)) {
456  INTERESTING("Alfresco");
457  }
458  else if (INFILE(_CR_MYSQL) || INFILE(_TITLE_mysql_floss_exception)) {
459  if (INFILE(_TITLE_MYSQL_V03)) {
460  INTERESTING("MySQL-0.3");
461  }
462  else {
463  INTERESTING("mysql-floss-exception");
464  }
465  }
466  else {
467  INTERESTING("MySQL-style");
468  }
469  lmem[_mLIBRE] = 1;
470  }
471  /*
472  * Some RealNetworks licenses included a list of "compatible" licenses that
473  * can confuse the license-detection algorithms within. Look for these early
474  * in the process, and ignore the known (false) matches when we detect the
475  * RPSL/RCSL licenses.
476  */
477  if (HASTEXT(_TEXT_REALNET, REG_EXTENDED)) {
478  /*
479  * List of other licenses should be excluded only if full license text is found
480  */
481  if (INFILE(_LT_RPSL_COMPATIBLE)) {
482  lmem[_fREAL] = 1;
483  }
484  if (INFILE(_LT_REAL_RPSL)) {
485  cp = REALVERS(_TITLE_RPSL);
486  INTERESTING(lDebug ? "RPSL" : cp);
487  }
488  else if (INFILE(_LT_REAL_RPSLref)) {
489  cp = REALVERS(_TITLE_RPSL);
490  INTERESTING(lDebug ? "Real-RPSL(ref)" : cp);
491  }
492  if (INFILE(_LT_REAL_RCSL)) {
493  cp = REALVERS(_TITLE_RCSL);
494  INTERESTING(lDebug ? "RCSL" : cp);
495  }
496  else if (INFILE(_LT_REAL_RCSLref)) {
497  cp = REALVERS(_TITLE_RCSL);
498  INTERESTING(lDebug ? "Real-RCSL(ref)" : cp);
499  }
500  if (INFILE(_TITLE_REAL_EULA)) {
501  INTERESTING("RealNetworks-EULA");
502  }
503  else if (INFILE(_LT_HELIX_TITLE)) {
504  INTERESTING("Helix.RealNetworks-EULA");
505  }
506  }
508  /*
509  * Zope - this license is explicitly listed (by title) in several other
510  * licenses...
511  */
512  if (!lmem[_mLIBRE] && !lmem[_fREAL] && INFILE(_TITLE_ZOPE)) {
513  if (INFILE(_TITLE_ZOPE_V21)) {
514  INTERESTING("ZPL-2.1");
515  lmem[_fZPL] = 1;
516  }
517  else if (INFILE(_TITLE_ZOPE_V20)) {
518  INTERESTING("ZPL-2.0");
519  lmem[_fZPL] = 1;
520  }
521  else if (INFILE(_TITLE_ZOPE_V10)) {
522  INTERESTING("ZPL-1.0");
523  lmem[_fZPL] = 1;
524  }
525  else if (INFILE(_TITLE_ZOPE_V11)) {
526  INTERESTING("ZPL-1.1");
527  lmem[_fZPL] = 1;
528  }
529  else if (INFILE(_SPDX_ZPL_11)) {
530  INTERESTING("ZPL-1.1");
531  lmem[_fZPL] = 1;
532  }
533  else if (INFILE(_SPDX_ZPL_20)) {
534  INTERESTING("ZPL-2.0");
535  lmem[_fZPL] = 1;
536  }
537  else if (INFILE(_SPDX_ZPL_21)) {
538  INTERESTING("ZPL-2.1");
539  lmem[_fZPL] = 1;
540  }
541  else if (INFILE(_TITLE_ZIMBRA_13)) {
542  INTERESTING("Zimbra-1.3");
543  }
544  else if (INFILE(_TITLE_ZIMBRA_12)) {
545  INTERESTING("Zimbra-1.2");
546  }
547  else {
548  INTERESTING(lDebug ? "Zope(ref)" : "ZPL");
549  lmem[_fZPL] = 1;
550  }
551  }
553  /*
554  * Check Apache licenses before BSD
555  */
556  if (HASTEXT(_PHR_Apache_ref0, REG_EXTENDED) || INFILE(_PHR_Apache_ref7) || INFILE(_TITLE_Apache)) {
557  cp = ASLVERS();
558  INTERESTING(cp);
559  }
561  /*
562  * BSD and all the variant 'flavors'. BSD licenses are kind of like
563  * the cooking concept of 'the mother sauces' -- MANY things are derived
564  * from the wordings of these licenses. There are still many more, for
565  * certain, but LOTS of licenses are based on ~10 originally-BSD-phrases.
566  */
567  if (INFILE(_LT_BSD_1)) {
568  if (INFILE(_TITLE_PHP301)) {
569  INTERESTING(lDebug ? "PHP(v3.01#1)" : "PHP-3.01");
570  lmem[_mPHP] = 1;
571  }
572  else if (INFILE(_TITLE_PHP30)) {
573  INTERESTING(lDebug ? "PHP(v3.0#1)" : "PHP-3.0");
574  lmem[_mPHP] = 1;
575  }
576  else if (INFILE(_TITLE_PHP202)) {
577  INTERESTING(lDebug ? "PHP(v2.02#1)" : "PHP-2.02");
578  lmem[_mPHP] = 1;
579  }
580  else if (INFILE(_CR_VOVIDA) || INFILE(_TITLE_VOVIDA)) {
581  INTERESTING("VSL-1.0");
582  lmem[_fBSD] = 1;
583  }
584  else if (INFILE(_CR_NAUMEN) || INFILE(_TITLE_NAUMEN)) {
585  INTERESTING("Naumen");
586  }
587  else if (INFILE(_CR_ENTESSA) || INFILE(_TITLE_ENTESSA)) {
588  INTERESTING("Entessa");
589  }
590  else if (INFILE(_LT_ATTRIB) || INFILE(_TITLE_ATTRIBUTION)) {
591  INTERESTING("AAL");
592  lmem[_fATTRIB] = 1;
593  }
594  else if (INFILE(_CR_ZOPE)) {
595  INTERESTING(lDebug ? "Zope(bsd)" : "ZPL");
596  }
597  else if (INFILE(_LT_Oracle_Berkeley_DB)) {
598  INTERESTING("Oracle-Berkeley-DB");
599  }
600  else if (INFILE(_CR_SLEEPYCAT) || INFILE(_LT_SLEEPYCAT_1)) {
601  MEDINTEREST(lDebug ? "Sleepycat(1)" : "Sleepycat");
602  }
603  else if (INFILE(_TITLE_ZEND_V20)) {
604  INTERESTING("Zend-2.0");
605  }
606  else if (!lmem[_fOPENLDAP] && !TRYGROUP(famOPENLDAP)) {
607  if (HASTEXT(_LT_OPENSSLref5, REG_EXTENDED)) {
608  INTERESTING(lDebug ? "OpenSSL(ref)" : "OpenSSL");
609  }
610  else if (INFILE(_LT_BSD_CLAUSE_0) && INFILE(_LT_BSD_CLAUSE_1) && INFILE(_LT_BSD_CLAUSE_2)) {
611  if (INFILE(_LT_BSD_CLAUSE_3) && (INFILE(_LT_BSD_CLAUSE_4) || INFILE(_LT_BSD_CLAUSE_4_LONG)) && INFILE(_LT_UC)) {
612  INTERESTING("BSD-4-Clause-UC");
613  }
614  else if (INFILE(_LT_BSD_CLAUSE_3) && (INFILE(_LT_BSD_CLAUSE_4) || INFILE(_LT_BSD_CLAUSE_4_LONG))) {
615  INTERESTING("BSD-4-Clause");
616  }
617  else if (INFILE(_LT_BSD_CLAUSE_4) && INFILE(_LT_BSD_CLAUSE_CLEAR)) {
618  INTERESTING("BSD-3-Clause-Clear");
619  }
620  else if (INFILE(_LT_BSD_CLAUSE_4) && INFILE(_LT_BSD_CLAUSE_OPEN_MPI)) {
621  INTERESTING("BSD-3-Clause-Open-MPI");
622  }
623  else if (INFILE(_LT_BSD_CLAUSE_4) && HASTEXT(_KW_severability, REG_EXTENDED)) {
624  INTERESTING("BSD-3-Clause-Severability");
625  }
626  else if (INFILE(_LT_XML_DB_V10)) {
627  INTERESTING("XMLDB-1.0");
628  }
629  else if (INFILE(_LT_BSD_CLAUSE_4) && INFILE(_LT_ANT_BSD_RESTRICTION)) {
630  INTERESTING("ANT+SharedSource");
631  }
632  else if (!lmem[_mAPACHE11] && INFILE(_LT_Apache_11_CLAUSE_3) && INFILE(_LT_Apache_11_CLAUSE_4) && INFILE(_LT_Apache_11_CLAUSE_5)) {
633  INTERESTING(lDebug ? "BSD(Apache-1.1)" : "Apache-1.1-style");
634  }
635  else if(HASTEXT(_LT_Sendmail_823_title, 0)) {
636  INTERESTING("Sendmail-8.23");
637  }
638  else if (!lmem[_mAPACHE10] && !lmem[_mAPACHE11] && INFILE(_LT_BSD_CLAUSE_ATTRIBUTION)) {
639  INTERESTING("BSD-3-Clause-Attribution");
640  }
641  else if (!lmem[_mAPACHE10] && !lmem[_mAPACHE11] && INFILE(_LT_BSD_CLAUSE_4)) {
642  if (INFILE(_LT_DARPA_COUGAAR_2)) {
643  INTERESTING("DARPA-Cougaar");
644  }
645  else {
646  INTERESTING("BSD-3-Clause");
647  }
648  }
649  else if (INFILE(_LT_SSLEAY)) {
650  INTERESTING("SSLeay");
651  }
652  else if (INFILE(_LT_TMATE)) {
653  INTERESTING("TMate");
654  }
655  else if (INFILE(_LT_MUP)) {
656  INTERESTING("Mup");
657  }
658  else if (INFILE(_LT_FREE_BSD)) {
659  INTERESTING("BSD-2-Clause-FreeBSD");
660  }
661  else if (INFILE(_LT_BSD_CLAUSE_PATENT)) {
662  INTERESTING("BSD-2-Clause-Patent");
663  }
664  else if (INFILE(_CR_NETBSD)) {
665  INTERESTING("BSD-2-Clause-NetBSD");
666  }
667  else if (INFILE(_LT_MIT_0)) {
668  lmem[_mMIT] = 1;
669  INTERESTING("Linux-OpenIB");
670  }
671  else if (!lmem[_mAPACHE10] && !lmem[_mAPACHE11]) {
672  INTERESTING("BSD-2-Clause");
673  }
674  }
675  else if (INFILE(_CR_CRYPTOGAMS)) {
676  INTERESTING("Cryptogams");
677  }
678  else if (INFILE(_LT_BSD_SHORTENED_CLAUSE_0) && INFILE(_LT_BSD_SHORTENED_CLAUSE_1) && INFILE(_LT_BSD_SHORTENED_CLAUSE_2) && INFILE(_LT_BSD_CLAUSE_3)) {
679  INTERESTING("BSD-4-Clause-Shortened");
680  }
681  else if (INFILE(_CR_BSDCAL)) {
682  INTERESTING(lDebug ? "BSD(1)" : "BSD");
683  }
684  else if (HASTEXT(_TEXT_ALTERED_SOURCE, REG_EXTENDED) && HASTEXT(_TEXT_ORIGIN, 0)) {
685  if (INFILE(_PHR_BZIP2_3)) {
686  INTERESTING("bzip2-1.0.5");
687  }
688  else if (HASTEXT(_PHR_BZIP2_4, REG_EXTENDED)) {
689  INTERESTING("bzip2-1.0.6");
690  }
691  else {
692  INTERESTING("bzip2");
693  }
694  }
695  else if (mCR_CMU()) {
696  INTERESTING(lDebug ? "CMU(BSD-ish)" : "CMU");
697  }
698  else if (INFILE(_LT_MTLL)) {
699  INTERESTING("MTLL");
700  }
701  else if (INFILE(_LT_BSD_CLAUSE_1_DISCLAIMER)) {
702  INTERESTING("BSD-1-Clause");
703  }
704  else if (INFILE(_LT_Spencer_99) && INFILE(_CR_Spencer)) {
705  INTERESTING("Spencer-99");
706  }
707  else if (!lmem[_fZPL]) {
708  INTERESTING(lDebug ? "BSD-style(1)" : "BSD-style");
709  }
710  }
711  lmem[_fBSD] = 1;
712  }
713  else if (INFILE(_LT_BSD_CLEAR_CLAUSE_0) && INFILE(_LT_BSD_CLAUSE_1) && INFILE(_LT_BSD_CLAUSE_2)) {
714  INTERESTING("BSD-3-Clause-Clear");
715  }
716  else if (INFILE(_PHR_Linux_OpenIB)) {
717  INTERESTING("Linux-OpenIB");
718  }
719  else if (INFILE(_LT_BSD_2)) {
720  /*
721  * Python, OSF, SecretLabs, some universities, some vendors, etc., have
722  * variants here.
723  */
724  if (INFILE(_CR_PYTHON) || INFILE(_TITLE_PYTHON)) {
725  cp = PYTHVERS();
726  INTERESTING(lDebug ? "Python(3)" : cp);
727  lmem[_mPYTHON] = 1;
728  }
729  else if (INFILE(_CR_OSF)) {
730  INTERESTING(lDebug ? "OSF(1)" : "OSF");
731  lmem[_mOSF] = 1;
732  }
733  else if (INFILE(_CR_UI)) {
734  INTERESTING(lDebug ? "UI(1)" : "Unix-Intl");
735  }
736  else if (INFILE(_CR_XOPEN)) {
737  INTERESTING(lDebug ? "XOpen(1)" : "X/Open");
738  lmem[_mXOPEN] = 1;
739  }
740  else if (INFILE(_PHR_HISTORICAL)) {
741  INTERESTING("HPND");
742  }
743  else if (INFILE(_LT_CMU_7)) {
744  if (INFILE(_CR_CMU_1) || INFILE(_CR_CMU_2) || INFILE(_CR_BSDCAL)) {
745  INTERESTING("MIT-CMU");
746  }
747  else {
748  INTERESTING("MIT-CMU-style");
749  }
750  lmem[_mCMU] = 1;
751  }
752  else if (INFILE(_CR_BSDCAL)) {
753  INTERESTING(lDebug ? "BSD(2)" : "BSD");
754  }
755  else if (INFILE(_LT_NTP)) {
756  INTERESTING("NTP");
757  }
758  else if (INFILE(_LT_WORDNET))
759  {
760  INTERESTING("WordNet-3.0");
761  lmem[_mMIT] = 1;
762  }
763  else if (INFILE(_LT_HPND_1) && INFILE(_LT_HPND_2)) {
764  INTERESTING("HPND");
765  lmem[_mMIT] = 1;
766  }
767  else if (INFILE(_LT_NOT_ADVERTISING)) {
768  INTERESTING(lDebug ? "BSD-style(2)" : "BSD-style");
769  }
770  else if (INFILE(_PHR_NO_WARRANTY_12)) {
771  INTERESTING(lDebug ? "ISC(BSD-style)" : "ISC-style");
772  }
773  else {
774  INTERESTING(lDebug ? "BSD-style(2)-MIT" : "MIT-style");
775  }
776  lmem[_fBSD] = 1;
777  }
778  else if (INFILE(_LT_BSD_3) && NOT_INFILE(_TITLE_OPENLDAP)) {
779  if (INFILE(_LT_AMPAS)) {
780  INTERESTING("AMPAS");
781  }
782  else if (INFILE(_CR_BSDCAL)) {
783  INTERESTING(lDebug ? "BSD(3)" : "BSD");
784  }
785  else if (INFILE(_TITLE_OZPLB_10)) {
786  INTERESTING("OZPLB-1.0");
787  }
788  /*
789  * JPNIC
790  */
791  else if (HASTEXT(_TEXT_JPNIC, 0) && INFILE(_LT_JPNIC)) {
792  INTERESTING("JPNIC");
793  }
794  else if (NOT_INFILE(_CR_XFREE86) && NOT_INFILE(_TITLE_NCSA) && NOT_INFILE(_TITLE_INNERNET200)) {
795  INTERESTING(lDebug ? "BSD-style(3)" : "BSD-style");
796  }
797  lmem[_fBSD] = 1;
798  }
799  else if (INFILE(_LT_BSD_4)) {
800  if (INFILE(_CR_BSDCAL)) {
801  INTERESTING(lDebug ? "BSD(4)" : "BSD");
802  }
803  else {
804  INTERESTING(lDebug ? "BSD-style(4)" : "BSD-style");
805  }
806  lmem[_fBSD] = 1;
807  }
808  /*
809  * FIX-ME: this license text explicitly mentions "for no-profit", and as
810  * such it should list it in the license-summary, yes?
811  */
812  else if (INFILE(_LT_BSD_5)) {
813  if (!lmem[_mPYTHON] && INFILE(_CR_PYTHON)) {
814  INTERESTING(lDebug ? "Python(2)" : "Python");
815  lmem[_mPYTHON] = 1;
816  }
817  else if (INFILE(_CR_USL_EUR)) {
818  INTERESTING(lDebug ? "USLE(1)" : "USL-Europe");
819  }
820  else if (INFILE(_CR_BSDCAL)) {
821  INTERESTING(lDebug ? "BSD(5)" : "BSD");
822  }
823  else {
824  INTERESTING(lDebug ? "BSD-style(5)" : "BSD-style");
825  }
826  lmem[_fBSD] = 1;
827  }
828  else if (INFILE(_LT_BSD_6)) {
829  if (INFILE(_CR_BSDCAL)) {
830  INTERESTING(lDebug ? "BSD(6)" : "BSD");
831  }
832  else {
833  INTERESTING(lDebug ? "BSD-style(6)" : "BSD-style");
834  }
835  lmem[_fBSD] = 1;
836  }
837  else if (INFILE(_LT_BSD_7)) {
838  if (HASTEXT(_LT_MAKEINDEX_1, 0) && HASTEXT(_LT_MAKEINDEX_2, 0)) {
839  INTERESTING("MakeIndex");
840  }
841  else if (INFILE(_CR_BSDCAL)) {
842  INTERESTING(lDebug ? "BSD(7)" : "BSD");
843  }
844  else {
845  INTERESTING(lDebug ? "BSD-style(7)" : "BSD-style");
846  }
847  lmem[_fBSD] = 1;
848  }
849  else if (INFILE(_LT_BSD_8)) {
850  if (INFILE(_CR_BSDCAL)) {
851  INTERESTING(lDebug ? "BSD(8)" : "BSD");
852  }
853  else {
854  INTERESTING(lDebug ? "BSD-style(8)" : "BSD-style");
855  }
856  lmem[_fBSD] = 1;
857  }
858  else if (INFILE(_LT_BSD_9)) {
859  if (INFILE(_CR_BSDCAL)) {
860  INTERESTING(lDebug ? "BSD(9)" : "BSD");
861  }
862  else {
863  INTERESTING(lDebug ? "BSD-style(8)" : "BSD-style");
864  }
865  lmem[_fBSD] = 1;
866  }
867  else if (INFILE(_LT_BSD_10)) {
868  if (INFILE(_CR_BSDCAL)) {
869  INTERESTING(lDebug ? "BSD(10)" : "BSD");
870  }
871  else {
872  INTERESTING(lDebug ? "BSD-style(9)" : "BSD-style");
873  }
874  lmem[_fBSD] = 1;
875  }
876  else if (INFILE(_LT_BSD_11)) {
877  if (INFILE(_CR_BSDCAL)) {
878  INTERESTING(lDebug ? "BSD(11)" : "BSD");
879  }
880  else {
881  INTERESTING(lDebug ? "BSD-style(10)" : "BSD-style");
882  }
883  lmem[_fBSD] = 1;
884  }
885  else if (INFILE(_LT_BSD_12)) {
886  if (INFILE(_CR_BSDCAL)) {
887  INTERESTING(lDebug ? "BSD(12)" : "BSD");
888  }
889  else {
890  INTERESTING(lDebug ? "BSD-style(11)" : "BSD-style");
891  }
892  lmem[_fBSD] = 1;
893  }
894  else if (INFILE(_LT_BSD_13)) {
895  if (INFILE(_CR_BSDCAL)) {
896  INTERESTING(lDebug ? "BSD(13)" : "BSD");
897  }
898  else {
899  INTERESTING(lDebug ? "BSD-style(12)" : "BSD-style");
900  }
901  lmem[_fBSD] = 1;
902  }
903  else if (INFILE(_LT_BSD_NONC)) {
904  if (INFILE(_CR_BSDCAL)) {
905  INTERESTING(lDebug ? "BSD(NonC)" : "BSD.non-commercial");
906  }
907  else {
908  INTERESTING(lDebug ? "BSD-style(NonC)" : "Non-commercial");
909  }
910  lmem[_fBSD] = 1;
911  }
912  else if (INFILE(_SPDX_BSD_3_Clause_Clear)) {
913  INTERESTING("BSD-3-Clause-Clear");
914  }
915  else if (INFILE(_SPDX_BSD_3_Clause_No_Nuclear_License_2014)) {
916  INTERESTING("BSD-3-Clause-No-Nuclear-License-2014");
917  }
918  else if (INFILE(_SPDX_BSD_3_Clause_No_Nuclear_License)) {
919  INTERESTING("BSD-3-Clause-No-Nuclear-License");
920  }
921  else if (INFILE(_SPDX_BSD_3_Clause_No_Nuclear_Warranty)) {
922  INTERESTING("BSD-3-Clause-No-Nuclear-Warranty");
923  }
924  else if (INFILE(_SPDX_BSD_3_Clause_Attribution)) {
925  INTERESTING("BSD-3-Clause-Attribution");
926  }
927  else if (INFILE(_SPDX_BSD_3_Clause_LBNL)) {
928  INTERESTING("BSD-3-Clause-LBNL");
929  }
930  else if (INFILE(_SPDX_BSD_3_Clause_Open_MPI)) {
931  INTERESTING("BSD-3-Clause-Open-MPI");
932  }
933  else if (INFILE(_SPDX_BSD_3_Clause)) {
934  INTERESTING("BSD-3-Clause");
935  }
936  else if (INFILE(_PHR_BSD_3_CLAUSE_1) || INFILE(_PHR_BSD_3_CLAUSE_2) || INFILE(_PHR_BSD_3_CLAUSE_3) || INFILE(_PHR_BSD_3_CLAUSE_4)) {
937  INTERESTING(lDebug ? "BSD(phr1/2)" : "BSD-3-Clause");
938  }
939  else if (INFILE(_SPDX_BSD_2_Clause_FreeBSD)) {
940  INTERESTING("BSD-2-Clause-FreeBSD");
941  }
942  else if (INFILE(_SPDX_BSD_2_Clause_NetBSD)) {
943  INTERESTING("BSD-2-Clause-NetBSD");
944  }
945  else if (INFILE(_SPDX_BSD_2_Clause_Patent)) {
946  INTERESTING("BSD-2-Clause-Patent");
947  }
948  else if (INFILE(_SPDX_BSD_2_Clause_Views)) {
949  INTERESTING("BSD-2-Clause-Views");
950  }
951  else if (INFILE(_SPDX_BSD_2_Clause_1)) {
952  INTERESTING("BSD-2-Clause");
953  }
954  else if (INFILE(_SPDX_BSD_2_Clause_2)) {
955  INTERESTING("BSD-2-Clause");
956  }
957  else if (INFILE(_PHR_BSD_2_CLAUSE_1)
958  || INFILE(_PHR_BSD_2_CLAUSE_2)
959  || INFILE(_PHR_BSD_2_CLAUSE_3)
960  || INFILE(_PHR_BSD_2_CLAUSE_4)
961  || INFILE(_PHR_BSD_2_CLAUSE_5)
962  || INFILE(_PHR_BSD_2_CLAUSE_6)
963  || INFILE(_PHR_BSD_2_CLAUSE_7)) {
964  INTERESTING(lDebug ? "BSD(phr1/2/3/4/5/6)" : "BSD-2-Clause");
965  }
966  else if (INFILE(_SPDX_BSD_4_Clause_UC)) {
967  INTERESTING("BSD-4-Clause-UC");
968  }
969  else if (INFILE(_SPDX_BSD_4_Clause)) {
970  INTERESTING("BSD-4-Clause");
971  }
972  else if (INFILE(_PHR_BSD_4_CLAUSE_1)) {
973  INTERESTING(lDebug ? "BSD-4-Clause(phr1)" : "BSD-4-Clause");
974  }
975  else if (INFILE(_PHR_BSD_CLEAR_1)) {
976  INTERESTING(lDebug ? "BSD-Clear(phr1)" : "BSD-3-Clause-Clear");
977  }
978  else if (INFILE(_LT_BSD_NUMPY_TERMS)) {
979  INTERESTING("BSD-3-Clause");
980  }
981  else if (INFILE(_PHR_BSD_3_CLAUSE_LBNL)) {
982  INTERESTING("BSD-3-Clause-LBNL");
983  }
984  else if (INFILE(_SPDX_BSD_Protection)) {
985  INTERESTING("BSD-Protection");
986  }
987  else if (INFILE(_SPDX_BSD_Source_Code)) {
988  INTERESTING("BSD-Source-Code");
989  }
990  else if (INFILE(_SPDX_BSD_1_Clause)) {
991  INTERESTING("BSD-1-Clause");
992  }
993  else if (INFILE(_PHR_0BSD)) {
994  INTERESTING("0BSD");
995  }
996  else if (INFILE(_LT_BSDref1)) {
997  INTERESTING(lDebug ? "BSD(ref1)" : "BSD");
998  }
999  else if (INFILE(_LT_BSDref2)) {
1000  INTERESTING(lDebug ? "BSD(ref2)" : "BSD");
1001  }
1002  else if (INFILE(_LT_BSDref3)) {
1003  INTERESTING(lDebug ? "BSD(ref3)" : "BSD");
1004  }
1005  else if (INFILE(_LT_BSDref4)) {
1006  INTERESTING(lDebug ? "BSD(ref4)" : "BSD");
1007  }
1008  else if (INFILE(_LT_BSDref5)) {
1009  INTERESTING(lDebug ? "BSD(ref5)" : "BSD");
1010  }
1011  else if (INFILE(_LT_BSDref6)) {
1012  INTERESTING(lDebug ? "BSD(ref6)" : "BSD");
1013  }
1014  else if (INFILE(_LT_BSDref7)) {
1015  INTERESTING(lDebug ? "BSD(ref7)" : "BSD");
1016  }
1017  else if (INFILE(_LT_BSDref8)) {
1018  INTERESTING(lDebug ? "BSD(ref8)" : "BSD");
1019  }
1020  else if (INFILE(_LT_BSDref9)) {
1021  INTERESTING(lDebug ? "BSD(ref9)" : "BSD");
1022  }
1023  else if (INFILE(_LT_BSDref10)) {
1024  INTERESTING(lDebug ? "BSD(ref10)" : "BSD");
1025  }
1026  else if (INFILE(_LT_BSDref11)) {
1027  INTERESTING(lDebug ? "BSD(ref11)" : "BSD");
1028  }
1029  else if (INFILE(_LT_BSDref12) || HASTEXT(_LT_BSDref13, REG_EXTENDED)) {
1030  INTERESTING(lDebug ? "BSD(ref12)" : "BSD-3-Clause");
1031  }
1032  else if (URL_INFILE(_URL_BSD_1) || URL_INFILE(_URL_BSD_2)) {
1033  INTERESTING(lDebug ? "BSD(url)" : "BSD");
1034  lmem[_fBSD] = 1;
1035  }
1036  else if (INFILE(_LT_BSDref14)) {
1037  INTERESTING(lDebug ? "BSD(ref14)" : "BSD");
1038  lmem[_fBSD] = 1;
1039  }
1040  else if (INFILE(_LT_BSDref15)) {
1041  INTERESTING(lDebug ? "BSD(ref15)" : "BSD");
1042  lmem[_fBSD] = 1;
1043  }
1044  else if (INFILE(_LT_BSDSTYLEref1)) {
1045  INTERESTING(lDebug ? "BSD-st(1)" : "BSD-style");
1046  lmem[_fBSD] = 1;
1047  }
1048  else if (INFILE(_LT_BSDSTYLEref2)) {
1049  INTERESTING(lDebug ? "BSD-st(2)" : "BSD-style");
1050  lmem[_fBSD] = 1;
1051  }
1052  else if (INFILE(_LT_BSDSTYLEref4)) {
1053  INTERESTING(lDebug ? "BSD-st(4)" : "BSD-style");
1054  lmem[_fBSD] = 1;
1055  }
1056  else if (INFILE(_LT_BSDSTYLEref3)) {
1057  INTERESTING(lDebug ? "BSD-st(3)" : "BSD-style");
1058  lmem[_fBSD] = 1;
1059  }
1060  else if (INFILE(_LT_BSD_HTMLAREA_1) || INFILE(_LT_BSD_HTMLAREA_2)) {
1061  INTERESTING(lDebug ? "BSD-htmlArea" : "BSD-3-Clause");
1062  lmem[_fBSD] = 1;
1063  }
1064  else if (INFILE(_FILE_BSD1) || INFILE(_FILE_BSD2)) {
1065  INTERESTING(lDebug ? "BSD(deb)" : "BSD");
1066  }
1067  else if (INFILE(_CR_BSD_PERSONAL)) {
1068  INTERESTING("BSD");
1069  }
1071  /*
1072  * Aptana public license (based on MPL)
1073  */
1074  if (INFILE(_LT_APTANA)) {
1075  if (INFILE(_TITLE_APTANA_V10)) {
1076  INTERESTING("Aptana-1.0");
1077  }
1078  else {
1079  INTERESTING("Aptana");
1080  }
1081  lmem[_mMPL] = 1;
1082  lmem[_mAPTANA] = 1;
1083  }
1084  /*
1085  * PHP variants
1086  */
1087  if (!lmem[_mPHP] && INFILE(_LT_PHP)) {
1088  if (INFILE(_TITLE_PHP301)) {
1089  INTERESTING(lDebug ? "PHP(v3.01#2)" : "PHP-3.01");
1090  }
1091  else if (INFILE(_TITLE_PHP30)) {
1092  INTERESTING(lDebug ? "PHP(v3.0#2)" : "PHP-3.0");
1093  }
1094  else if (INFILE(_TITLE_PHP202)) {
1095  INTERESTING(lDebug ? "PHP(v2.02#3)" : "PHP-2.02");
1096  }
1097  else if (INFILE(_CR_PHP)) {
1098  INTERESTING(lDebug ? "PHP(1)" : "PHP");
1099  }
1100  else {
1101  INTERESTING("PHP-style");
1102  }
1103  lmem[_mPHP] = 1;
1104  }
1105  else if (!lmem[_mPHP] && INFILE(_LT_PHP_V301_1)) {
1106  INTERESTING("PHP-3.01");
1107  lmem[_mPHP] = 1;
1108  }
1109  else if (!lmem[_mPHP] && INFILE(_LT_PHP_V30_1)) {
1110  INTERESTING("PHP-3.0");
1111  lmem[_mPHP] = 1;
1112  }
1113  else if (!lmem[_mPHP] && INFILE(_LT_PHP_V30_2)) {
1114  INTERESTING("PHP-3.0");
1115  lmem[_mPHP] = 1;
1116  }
1117  else if (!lmem[_mPHP] && INFILE(_LT_PHPref1)) {
1118  if (INFILE(_PHR_PHP_V301)) {
1119  INTERESTING(lDebug ? "PHP(ref-3.01)" : "PHP-3.01");
1120  }
1121  else if (INFILE(_PHR_PHP_V20)) {
1122  INTERESTING(lDebug ? "PHP(ref-2.0)" : "PHP-2.0");
1123  }
1124  else {
1125  INTERESTING(lDebug ? "PHP(ref)" : "PHP");
1126  }
1127  lmem[_mPHP] = 1;
1128  }
1129  else if (!lmem[_mPHP] && URL_INFILE(_URL_PHP)) {
1130  INTERESTING(lDebug ? "PHP(url)" : "PHP");
1131  lmem[_mPHP] = 1;
1132  }
1133  else if (INFILE(_LT_PHP_ref)) {
1134  INTERESTING(lDebug ? "PHP(2)" : "PHP");
1135  lmem[_mPHP] = 1;
1136  }
1138  /*
1139  * Licenses between here and all the GPL/LGPL/GFDL/FSF checks (below) MUST
1140  * be tested PRIOR to checking GPL/FSF and friends
1141  */
1142  if ((INFILE(_CR_EASYSW) || INFILE(_TITLE_CUPS)) && INFILE(_LT_CUPS)) {
1143  if (INFILE(_LT_CUPS_COMMERCIAL)) {
1144  INTERESTING("CUPS-EULA");
1145  }
1146  else {
1147  INTERESTING("CUPS");
1148  }
1149  lmem[_mCUPS] = 1;
1150  }
1152  if (INFILE(_LT_HACKTIVISMO)) {
1153  INTERESTING("Hacktivismo");
1154  lmem[_mGPL] = 1; /* don't look for GPL references */
1155  }
1157  if (INFILE(_LT_NESSUS) && INFILE(_TITLE_NESSUS)) {
1158  INTERESTING("NESSUS-EULA");
1159  lmem[_mLGPL] = 1; /* don't look for LGPL references */
1160  lmem[_mGPL] = 1;
1161  }
1163  /*
1164  * Oracle
1165  */
1166  if (INFILE(_LT_ORACLE_PROTO) && INFILE(_TITLE_ORACLE_PROTO)) {
1167  INTERESTING(lDebug ? "Oracle(proto)" : "Oracle-EULA");
1168  lmem[_mGPL] = 1;
1169  }
1170  else if (INFILE(_LT_ORACLE_DEVEL) && INFILE(_TITLE_ORACLE_DEVEL)) {
1171  INTERESTING(lDebug ? "Oracle(dev)" : "Oracle-Dev");
1172  }
1173  else if (URL_INFILE(_URL_ORACLE_BERKELEY_DB)) {
1174  INTERESTING(lDebug ? "URL_ORACLE_BERKELEY_DB" : "Oracle-Berkeley-DB");
1175  }
1177  /*
1178  * DB License
1179  */
1180  if (INFILE(_LT_DATABRICKS_RESTRICTED)) {
1181  INTERESTING("Databricks-DB-License");
1182  }
1184  /*
1185  * CeCILL
1186  * According to digikam-0.9.4/digikam/libs/greycstoration/CImg.h:
1187  * The CeCILL-C (C_V1) license is close to the GNU LGPL
1188  * The CeCILL (V2.0) license is compatible with the GNU GPL
1189  */
1190  if (INFILE(_TITLE_CECILL_V11_2) || INFILE(_SPDX_CECILL_11)) {
1191  INTERESTING(lDebug ? "CeCILL_v1.1(#2)" : "CECILL-1.1");
1192  lmem[_mGPL] = lmem[_mLGPL] = 1;
1193  }
1194  else if (INFILE(_TITLE_CECILL_B) || INFILE(_TITLE_CECILL_B1) || INFILE(_SPDX_CECILL_B)) {
1195  INTERESTING("CECILL-B");
1196  }
1197  else if (INFILE(_TITLE_CECILL_C) || INFILE(_TITLE_CECILL_C1) || INFILE(_SPDX_CECILL_C)) {
1198  INTERESTING("CECILL-C");
1199  }
1200  else if (INFILE(_LT_CECILL_DUALref)) {
1201  INTERESTING("CECILL(dual)");
1202  lmem[_mGPL] = lmem[_mLGPL] = 1;
1203  }
1204  else if (INFILE(_SPDX_CECILL_10)) {
1205  INTERESTING("CECILL-1.0");
1206  }
1207  else if (INFILE(_SPDX_CECILL_21)) {
1208  INTERESTING("CECILL-2.1");
1209  }
1210  else if (INFILE(_LT_CECILL_2_ref) || INFILE(_SPDX_CECILL_20)) {
1211  INTERESTING("CECILL-2.0");
1212  }
1213  else if (INFILE(_LT_CECILL_ref2)) {
1214  INTERESTING("CECILL");
1215  }
1216  else if (INFILE(_LT_CECILL_B_ref)) {
1217  INTERESTING("CECILL-B");
1218  }
1219  else if (INFILE(_LT_CECILL_ref) || INFILE(_LT_CECILL_ref1)) {
1220  if (URL_INFILE(_URL_CECILL_C_V11)) {
1221  INTERESTING(lDebug ? "CeCILL_v1.1(url)" : "CECILL-1.1");
1222  }
1223  else if (URL_INFILE(_URL_CECILL_C_V1)) {
1224  INTERESTING(lDebug ? "CeCILL_v1(url)" : "CECILL-1.0");
1225  }
1226  else if (URL_INFILE(_URL_CECILL_V2)) {
1227  INTERESTING(lDebug ? "CeCILL_v2(url)" : "CECILL-2.0");
1228  }
1229  else if (URL_INFILE(_URL_CECILL)) {
1230  INTERESTING(lDebug ? "CeCILL(url)" : "CECILL");
1231  }
1232  else {
1233  INTERESTING(lDebug ? "CeCILL(#3)" : "CECILL");
1234  }
1235  lmem[_mGPL] = 1;
1236  }
1237  else if (INFILE(_LT_CECILL_1)) {
1238  if (INFILE(_TITLE_CECILL_V10)) {
1239  INTERESTING(lDebug ? "CeCILL_v1.0(#1)" : "CECILL-1.0");
1240  }
1241  else if (INFILE(_TITLE_CECILL_V20)) {
1242  INTERESTING(lDebug ? "CeCILL_v2.0(#1)" : "CECILL-2.0");
1243  }
1244  lmem[_mGPL] = 1;
1245  }
1246  else if (INFILE(_LT_CECILL_2) || INFILE(_TITLE_CECILL1) || INFILE(_TITLE_CECILL2)) {
1247  if (INFILE(_TITLE_CECILL_V10)) {
1248  INTERESTING(lDebug ? "CeCILL_v1.0(#2)" : "CECILL-1.0");
1249  }
1250  else if (INFILE(_TITLE_CECILL_V11)) {
1251  INTERESTING(lDebug ? "CeCILL_v1.1(#1)" : "CECILL-1.1");
1252  }
1253  else if (INFILE(_TITLE_CECILL_V20)) {
1254  INTERESTING(lDebug ? "CeCILL_v2.0(#2)" : "CECILL-2.0");
1255  }
1256  else {
1257  INTERESTING(lDebug ? "CeCILL(#2)" : "CECILL");
1258  }
1259  lmem[_mGPL] = 1;
1260  }
1262  /*
1263  * Monash University
1264  */
1265  if (INFILE(_CR_UMONASH) && INFILE(_LT_UMONASH)) {
1266  INTERESTING("U-Monash");
1267  if (INFILE(_PHR_GPL_NO_MORE)) {
1268  lmem[_mGPL] = 1;
1269  }
1270  }
1272  /* Open Font License */
1273  if (INFILE(_LT_OPEN_FONT_V10) || INFILE(_LT_OPEN_FONT_V10_1))
1274  {
1275  INTERESTING("OFL-1.0");
1276  lmem[_fOFL] = 1;
1277  }
1278  else if (INFILE(_SPDX_OFL_10_no_RFN)) {
1279  INTERESTING("OFL-1.0-no-RFN");
1280  }
1281  else if (INFILE(_SPDX_OFL_10_RFN)) {
1282  INTERESTING("OFL-1.0-RFN");
1283  }
1284  else if (INFILE(_SPDX_OFL_10)) {
1285  INTERESTING("OFL-1.0");
1286  }
1287  else if (INFILE(_PHR_OPEN_FONT_V10_1) || INFILE(_PHR_OPEN_FONT_V10_2))
1288  {
1289  INTERESTING("OFL-1.0");
1290  lmem[_fOFL] = 1;
1291  }
1292  else if (INFILE(_LT_OPEN_FONT_V11) || INFILE(_LT_OPEN_FONT_V11_1))
1293  {
1294  INTERESTING("OFL-1.1");
1295  lmem[_fOFL] = 1;
1296  }
1297  else if (INFILE(_SPDX_OFL_11_no_RFN)) {
1298  INTERESTING("OFL-1.1-no-RFN");
1299  }
1300  else if (INFILE(_SPDX_OFL_11_RFN)) {
1301  INTERESTING("OFL-1.1-RFN");
1302  }
1303  else if (INFILE(_SPDX_OFL_11)) {
1304  INTERESTING("OFL-1.1");
1305  }
1306  else if (INFILE(_PHR_OPEN_FONT_V11_1) || INFILE(_PHR_OPEN_FONT_V11_2))
1307  {
1308  INTERESTING("OFL-1.1");
1309  lmem[_fOFL] = 1;
1310  }
1312  /* Simple Public License 2.0 */
1313  if (INFILE(_TITLE_SimPL_V2)) {
1314  INTERESTING("SimPL-2.0");
1315  lmem[_mGPL] = 1;
1316  }
1318  /* Leptonica license */
1319  if (INFILE(_TITLE_LEPTONICA) && INFILE(_LT_GNU_3)) {
1320  INTERESTING("Leptonica");
1321  }
1323  /* copyleft-next license
1324  * It has to be checked before GPL because the license has the reference
1325  * to GPL license which gives a false positive GPL finding.
1326  */
1327  if (INFILE(_TITLE_copyleft_next_030) && INFILE(_PHR_copyleft_next_PARA1) && INFILE(_PHR_copyleft_next_PARA3)) {
1328  INTERESTING("copyleft-next-0.3.0");
1329  lmem[_mGPL] = 1;
1330  }
1331  else if (INFILE(_TITLE_copyleft_next_031) && INFILE(_PHR_copyleft_next_PARA1) && INFILE(_PHR_copyleft_next_PARA3)) {
1332  INTERESTING("copyleft-next-0.3.1");
1333  lmem[_mGPL] = 1;
1334  }
1335  else if (INFILE(_PHR_copyleft_next_030) || INFILE(_SPDX_copyleft_next_030)) {
1336  INTERESTING("copyleft-next-0.3.0");
1337  }
1338  else if (INFILE(_PHR_copyleft_next_031) || INFILE(_SPDX_copyleft_next_031)) {
1339  INTERESTING("copyleft-next-0.3.1");
1340  }
1342  /*
1343  * GPL, LGPL, GFDL
1344  * QUESTION: do we need to check for the FSF copyright since we also
1345  * check for "GNU" or "free"?
1346  */
1347  if ((NOT_INFILE(_LT_FORMER_GNU) && (mCR_FSF() ||
1348  HASTEXT(_TEXT_GNUTERMS, REG_EXTENDED)))) {
1349  /*
1350  * Affero
1351  */
1352  if (INFILE(_PHR_AGPL) && NOT_INFILE(_LT_GPL3ref4)) {
1353  if (INFILE(_LT_AGPL1) || INFILE(_LT_AGPL2) ||
1354  INFILE(_LT_AGPL3)) {
1355  cp = AGPLVERS();
1356  INTERESTING(lDebug ? "Affero(#1)" : cp);
1357  lmem[_mGPL] = 1;
1358  }
1359  else if (INFILE(_LT_AGPLref1)) {
1360  cp = AGPLVERS();
1361  INTERESTING(lDebug ? "Affero(#2)" : cp);
1362  lmem[_mGPL] = 1;
1363  }
1364  else if (INFILE(_LT_AGPLref2) && NOT_INFILE(_LT_NOT_AGPLref1)) {
1365  cp = AGPLVERS();
1366  INTERESTING(lDebug ? "Affero(#3)" : cp);
1367  lmem[_mGPL] = 1;
1368  }
1369  else if (mCR_FSF() && NOT_INFILE(_LT_GPL3_NOT_AGPL)) {
1370  cp = AGPLVERS();
1371  INTERESTING(lDebug ? "Affero(CR)" : cp);
1372  lmem[_mGPL] = 1;
1373  }
1374  }
1375  else if (INFILE(_LT_AGPL_NAMED)) {
1376  cp = AGPLVERS();
1377  INTERESTING(lDebug ? "AGPL(named)" : cp);
1378  lmem[_mGPL] = 1;
1379  }
1380 
1381  /*
1382  * Some packages have a single file containing both a GPL and an LGPL
1383  * license. Therefore, these checks should NOT be exclusive.
1384  */
1385  /* * The Nethack General Public License (NGPL) */
1386  else if (INFILE(_TITLE_NGPL)) {
1387  INTERESTING("NGPL");
1388  lmem[_mGPL] = 1;
1389  }
1390  else if (INFILE(_LT_GPL_V1)) {
1391  INTERESTING("GPL-1.0-only");
1392  lmem[_mGPL] = 1;
1393  }
1394  else if (INFILE(_LT_GPL_1) && !HASTEXT(_LT_GPL_EXCEPT_0, REG_EXTENDED)) {
1395  if (INFILE(_PHR_GPL2_OR_LATER_1) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
1396  {
1397  INTERESTING(lDebug ? "PHR(GPL2_OR_LATER#1)" : "GPL-2.0-or-later");
1398  lmem[_mGPL] = 1;
1399  }
1400  else if (INFILE(_TITLE_GPL2)) {
1401  INTERESTING(lDebug ? "Title(GPL-2.0-only)" : "GPL-2.0-only");
1402  lmem[_mGPL] = 1;
1403  }
1404  else if (INFILE(_PHR_GPL1_OR_LATER) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
1405  {
1406  INTERESTING("GPL-1.0-or-later");
1407  lmem[_mGPL] = 1;
1408  }
1409  else if (INFILE(_TITLE_GPL1)) {
1410  INTERESTING("GPL-1.0-only");
1411  lmem[_mGPL] = 1;
1412  }
1413  else {
1414  INTERESTING("GPL");
1415  lmem[_mGPL] = 1;
1416  }
1417  }
1418  else if ((INFILE(_LT_GPL_V2) || INFILE(_LT_GPL_V2_ref) || INFILE(_LT_GPL_V2_ref1) || INFILE(_LT_GPL_V2_ref2)) && !HASTEXT(_LT_GPL_EXCEPT_0, REG_EXTENDED)) {
1419  if (INFILE(_PHR_GPL2_OR_LATER_1) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
1420  {
1421  INTERESTING(lDebug ? "PHR(GPL2_OR_LATER#2)" : "GPL-2.0-or-later");
1422  lmem[_mGPL] = 1;
1423  }
1424  else {
1425  INTERESTING(lDebug ? "LT(GPL-V2)" : "GPL-2.0-only");
1426  lmem[_mGPL] = 1;
1427  }
1428  }
1429  else if (INFILE(_PHR_GPL2_OR_LATER_2))
1430  {
1431  INTERESTING(lDebug ? "PHR(GPL2_OR_LATER#2)" : "GPL-2.0-or-later");
1432  lmem[_mGPL] = 1;
1433  }
1434  else if (INFILE(_LT_GPL3_PATENTS)) {
1435  if (INFILE(_TITLE_GPL3)) {
1436  INTERESTING(lDebug ? "GPL_v3(#1)" : "GPL-3.0-only");
1437  lmem[_mGPL] = 1;
1438  }
1439  else {
1440  INTERESTING("GPL-3.0-only-possibility");
1441  lmem[_mGPL] = 1;
1442  }
1443  }
1444  else if (INFILE(_TITLE_GPL3_ref3_later)) {
1445  INTERESTING("GPL-3.0-or-later");
1446  lmem[_mGPL] = 1;
1447  }
1448  else if (INFILE(_TITLE_GPL3_ref4_later)) {
1449  INTERESTING("GPL-3.0-or-later");
1450  lmem[_mGPL] = 1;
1451  }
1452  else if (INFILE(_TITLE_GPL3_ref3)) {
1453  INTERESTING("GPL-3.0-only");
1454  lmem[_mGPL] = 1;
1455  }
1456  if (INFILE(_LT_LGPL_1) || INFILE(_LT_LGPL_2) || INFILE(_LT_LGPL21_OR_LATER_GENERAL)) {
1457  if (INFILE(_PHR_LGPL21_OR_LATER_1) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
1458  {
1459  INTERESTING("LGPL-2.1-or-later");
1460  lmem[_mLGPL] = 1;
1461  }
1462  else if (INFILE(_PHR_LGPL2_OR_LATER) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
1463  {
1464  INTERESTING("LGPL-2.0-or-later");
1465  lmem[_mLGPL] = 1;
1466  }
1467  else if (INFILE(_TITLE_LGPLV21)) {
1468  INTERESTING("LGPL-2.1-only");
1469  lmem[_mLGPL] = 1;
1470  }
1471  else if (INFILE(_TITLE_LGPLV2)) {
1472  INTERESTING("LGPL-2.0-only");
1473  lmem[_mLGPL] = 1;
1474  }
1475  else {
1476  INTERESTING("LGPL");
1477  lmem[_mLGPL] = 1;
1478  }
1479  }
1480  else if (INFILE(_LT_LGPL_3)) {
1481  if ((INFILE(_PHR_LGPL3_OR_LATER)
1482  || INFILE(_PHR_LGPL3_OR_LATER_ref1)
1483  || INFILE(_PHR_LGPL3_OR_LATER_ref2))
1484  && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
1485  {
1486  INTERESTING("LGPL-3.0-or-later");
1487  lmem[_mLGPL] = 1;
1488  }
1489  else if (INFILE(_TITLE_LGPL3)) {
1490  INTERESTING("LGPL-3.0-only");
1491  lmem[_mLGPL] = 1;
1492  }
1493  else {
1494  INTERESTING("LGPL-3.0-only-possibility");
1495  lmem[_mLGPL] = 1;
1496  }
1497  }
1498  if (INFILE(_LT_GFDL)) {
1499  cp = GFDLVERS();
1500  INTERESTING(lDebug ? "GFDL(#1)" : cp);
1501  lmem[_mGFDL] = 1;
1502  }
1503  if (!lmem[_mLGPL] && NOT_INFILE(_LT_MPL_SECONDARY)) { /* no FSF/GPL-like match yet */
1504  /*
1505  NOTE: search for LGPL before GPL; the latter matches
1506  occurrences of former
1507  */
1508  if (INFILE(_LT_GPL_FONT1) && INFILE(_LT_GPL_FONT2)) {
1509  INTERESTING(lDebug ? "GPL(fonts)" : "GPL-exception");
1510  lmem[_mGPL] = 1;
1511  }
1512  else if (INFILE(_LT_LGPL_ALT)) {
1513  cp = LGPLVERS();
1514  INTERESTING(lDebug ? "LGPL(alternate)" : cp);
1515  lmem[_mLGPL] = 1;
1516  }
1517  else if (INFILE(_LT_LGPL3_ref_later)) {
1518  INTERESTING("LGPL-3.0-or-later");
1519  lmem[_mLGPL] = 1;
1520  }
1521  else if (INFILE(_LT_LGPLref1)) {
1522  cp = LGPLVERS();
1523  INTERESTING(lDebug ? "LGPL(ref1)" : cp);
1524  lmem[_mLGPL] = 1;
1525  }
1526  else if (INFILE(_LT_LGPLref2) &&
1527  NOT_INFILE(_PHR_NOT_UNDER_LGPL)) {
1528  cp = LGPLVERS();
1529  INTERESTING(lDebug ? "LGPL(ref2#1)" : cp);
1530  lmem[_mLGPL] = 1;
1531  }
1532  else if (INFILE(_LT_LGPLref3)) {
1533  cp = LGPLVERS();
1534  INTERESTING(lDebug ? "LGPL(ref3)" : cp);
1535  lmem[_mLGPL] = 1;
1536  }
1537  else if (INFILE(_LT_LGPLref4)) {
1538  cp = LGPLVERS();
1539  INTERESTING(lDebug ? "LGPL(ref4)" : cp);
1540  lmem[_mLGPL] = 1;
1541  }
1542  else if (INFILE(_LT_LGPLref5)) {
1543  cp = LGPLVERS();
1544  INTERESTING(lDebug ? "LGPL(ref5)" : cp);
1545  lmem[_mLGPL] = 1;
1546  }
1547  else if (INFILE(_LT_LGPLref6)) {
1548  cp = LGPLVERS();
1549  INTERESTING(lDebug ? "LGPL(ref6)" : cp);
1550  lmem[_mLGPL] = 1;
1551  }
1552  else if (!lmem[_mLIBRE] && !lmem[_fREAL] &&
1553  INFILE(_LT_LGPLref7) &&
1554  NOT_INFILE(_PHR_NOT_UNDER_LGPL)) {
1555  cp = LGPLVERS();
1556  INTERESTING(lDebug ? "LGPL(ref7)" : cp);
1557  lmem[_mLGPL] = 1;
1558  }
1559  else if (!lmem[_fREAL] && !lmem[_mAPTANA] &&
1560  !LVAL(_TEXT_GNU_LIC_INFO) && INFILE(_LT_LGPLref8) &&
1561  NOT_INFILE(_PHR_NOT_UNDER_LGPL)) {
1562  cp = LGPLVERS();
1563  INTERESTING(lDebug ? "LGPL(ref8)" : cp);
1564  lmem[_mLGPL] = 1;
1565  }
1566  else if (INFILE(_LT_LGPLref9) &&
1567  NOT_INFILE(_PHR_NOT_UNDER_LGPL)) {
1568  cp = LGPLVERS();
1569  INTERESTING(lDebug ? "LGPL(ref9)" : cp);
1570  lmem[_mLGPL] = 1;
1571  }
1572  else if (INFILE(_LT_LGPLref10) &&
1573  NOT_INFILE(_PHR_NOT_UNDER_LGPL)) {
1574  cp = LGPLVERS();
1575  INTERESTING(lDebug ? "LGPL(ref10)" : cp);
1576  lmem[_mLGPL] = 1;
1577  }
1578  else if (INFILE(_LT_LGPLref11)) {
1579  cp = LGPLVERS();
1580  INTERESTING(lDebug ? "LGPL(ref11)" : cp);
1581  lmem[_mLGPL] = 1;
1582  }
1583  else if (INFILE(_FILE_LGPL1) || INFILE(_FILE_LGPL2)) {
1584  cp = LGPLVERS();
1585  INTERESTING(lDebug ? "LGPL(deb)" : cp);
1586  lmem[_mLGPL] = 1;
1587  }
1588  else if (!LVAL(_TEXT_GNU_LIC_INFO) &&
1589  (URL_INFILE(_URL_LGPL_1) ||
1590  URL_INFILE(_URL_LGPL_2))) {
1591  cp = LGPLVERS();
1592  INTERESTING(lDebug ? "LGPL(url)" : cp);
1593  lmem[_mLGPL] = 1;
1594  }
1595  else if (lmem[_fREAL] && !LVAL(_TEXT_GNU_LIC_INFO) &&
1596  GPL_INFILE(_LT_LGPL_OR)) {
1597  cp = LGPLVERS();
1598  INTERESTING(lDebug ? "LGPL(or)" : cp);
1599  lmem[_mLGPL] = 1;
1600  }
1601  else if (INFILE(_PHR_LGPL21_OR_LATER_2)) {
1602  INTERESTING(lDebug ? "LGPL-2.1-or-later(_LATER_2)" : "LGPL-2.1-or-later");
1603  lmem[_mLGPL] = 1;
1604  }
1605  else if (INFILE(_PHR_LGPL21_ONLY_ref) || INFILE(_TITLE_LGPLV21_2)) {
1606  INTERESTING("LGPL-2.1-only");
1607  lmem[_mLGPL] = 1;
1608  }
1609  }
1610  if (!lmem[_mGPL] && !HASTEXT(_TEXT_GCC, REG_EXTENDED)) {
1611  if (GPL_INFILE(_LT_GPL_ALT) && !INFILE(_LT_LGPL_ALT)) {
1612  cp = GPLVERS();
1613  INTERESTING(lDebug ? "GPL(alternate)" : cp);
1614  lmem[_mGPL] = 1;
1615  }
1616  else if ((GPL_INFILE(_LT_GPL3ref2) || GPL_INFILE(_PHR_GPL3_OR_LATER)
1617  || GPL_INFILE(_PHR_GPL3_OR_LATER_ref1) || GPL_INFILE(_PHR_GPL3_OR_LATER_ref2))
1618  && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
1619  {
1620  INTERESTING("GPL-3.0-or-later");
1621  lmem[_mGPL] = 1;
1622  }
1623  else if (GPL_INFILE(_LT_GPL3ref)) {
1624  INTERESTING(lDebug ? "GPL_v3(#2)" : "GPL-3.0-only");
1625  lmem[_mGPL] = 1;
1626  }
1627  else if (GPL_INFILE(_LT_GPL3ref3) && NOT_INFILE(_TITLE_LGPL3)) {
1628  INTERESTING("GPL-3.0-only");
1629  lmem[_mGPL] = 1;
1630  }
1631  else if (!lmem[_mLIBRE] && GPL_INFILE(_LT_GPLref1)
1632  && NOT_INFILE(_PHR_NOT_UNDER_GPL)
1633  && NOT_INFILE(_LT_LGPLref2)
1634  && NOT_INFILE(_PHR_GPL_COMPAT_3)) {
1635  /*
1636  * Special exceptions:
1637  * (1) LaTeX uses the following phrase:
1638  * "... why distributing LaTeX under the GNU General Public License (GPL)
1639  * was considered inappropriate".
1640  * (2) Python uses the following phrases:
1641  * "GPL-compatible doesn't mean that we're distributing Python under the GPL"
1642  * AND, "GPL-compatible licenses make it possible to combine Python with
1643  * other software that is released under the GPL.
1644  *****
1645  * These MUST be filtered. Do so by marking the GPL flag but don't assign
1646  * a license component (e.g., ignore GPL for this file)
1647  */
1648  if (INFILE(_PHR_LATEX_GPL_INAPPROPRIATE) ||
1649  INFILE(_PHR_PYTHON_NOTGPL_1) ||
1650  INFILE(_PHR_PYTHON_NOTGPL_2)) {
1651  lmem[_mGPL] = 1;
1652  }
1653  else if (!HASTEXT(_TEXT_GCC, REG_EXTENDED)
1654  && NOT_INFILE(_TITLE_D_FSL_10)){
1655  cp = GPLVERS();
1656  INTERESTING(cp);
1657  lmem[_mGPL] = 1;
1658  }
1659  }
1660  else if (INFILE(_LT_GPL_FSF)) {
1661  cp = GPLVERS();
1662  INTERESTING(lDebug ? "GPL(FSF)" : cp);
1663  lmem[_mGPL] = 1;
1664  }
1665  else if (GPL_INFILE(_LT_GPLref2)) {
1666  cp = GPLVERS();
1667  INTERESTING(lDebug ? "GPL(ref2)" : cp);
1668  lmem[_mGPL] = 1;
1669  }
1670  else if (GPL_INFILE(_LT_GPLref3)) {
1671  cp = GPLVERS();
1672  INTERESTING(lDebug ? "GPL(ref3)" : cp);
1673  lmem[_mGPL] = 1;
1674  }
1675  else if (INFILE(_LT_GPLref4)) {
1676  cp = GPLVERS();
1677  INTERESTING(lDebug ? "GPL(ref4)" : cp);
1678  lmem[_mGPL] = 1;
1679  }
1680  else if (GPL_INFILE(_LT_GPLref5)) {
1681  cp = GPLVERS();
1682  INTERESTING(lDebug ? "GPL(ref5)" : cp);
1683  lmem[_mGPL] = 1;
1684  }
1685  else if (GPL_INFILE(_LT_GPLref6)) {
1686  cp = GPLVERS();
1687  INTERESTING(lDebug ? "GPL(ref6)" : cp);
1688  lmem[_mGPL] = 1;
1689  }
1690  else if (GPL_INFILE(_LT_GPLref7)) {
1691  cp = GPLVERS();
1692  INTERESTING(lDebug ? "GPL(ref7)" : cp);
1693  lmem[_mGPL] = 1;
1694  }
1695  else if (GPL_INFILE(_LT_GPLref8)) {
1696  cp = GPLVERS();
1697  INTERESTING(lDebug ? "GPL(ref8)" : cp);
1698  lmem[_mGPL] = 1;
1699  }
1700  else if (INFILE(_LT_GPLref9)) {
1701  cp = GPLVERS();
1702  INTERESTING(lDebug ? "GPL(ref9)" : cp);
1703  lmem[_mGPL] = 1;
1704  }
1705  else if (GPL_INFILE(_LT_GPLref10)) {
1706  cp = GPLVERS();
1707  INTERESTING(lDebug ? "GPL(ref10)" : cp);
1708  lmem[_mGPL] = 1;
1709  }
1710  else if (INFILE(_LT_GPLref11)) {
1711  cp = GPLVERS();
1712  INTERESTING(lDebug ? "GPL(ref11)" : cp);
1713  lmem[_mGPL] = 1;
1714  }
1715  else if (INFILE(_LT_GPLref12)) {
1716  cp = GPLVERS();
1717  INTERESTING(lDebug ? "GPL(ref12)" : cp);
1718  lmem[_mGPL] = 1;
1719  }
1720  else if (GPL_INFILE(_LT_GPLref13)) {
1721  cp = GPLVERS();
1722  INTERESTING(lDebug ? "GPL(ref13)" : cp);
1723  lmem[_mGPL] = 1;
1724  }
1725  else if (GPL_INFILE(_LT_GPLref14) &&
1726  NOT_INFILE(_LT_LGPLref2)) {
1727  cp = GPLVERS();
1728  INTERESTING(lDebug ? "GPL(ref14)" : cp);
1729  lmem[_mGPL] = 1;
1730  }
1731  else if (INFILE(_LT_GPLref16)) {
1732  cp = GPLVERS();
1733  INTERESTING(lDebug ? "GPL(ref16)" : cp);
1734  lmem[_mGPL] = 1;
1735  }
1736  else if (INFILE(_LT_GPLref18)) {
1737  cp = GPLVERS();
1738  INTERESTING(lDebug ? "GPL(ref18)" : cp);
1739  lmem[_mGPL] = 1;
1740  }
1741  else if (INFILE(_LT_GPLref19)) {
1742  cp = GPLVERS();
1743  INTERESTING(lDebug ? "GPL(ref19)" : cp);
1744  lmem[_mGPL] = 1;
1745  }
1746  else if (INFILE(_LT_GPLref20)) {
1747  cp = GPLVERS();
1748  INTERESTING(lDebug ? "GPL(ref20)" : cp);
1749  lmem[_mGPL] = 1;
1750  }
1751  else if (!LVAL(_TEXT_GNU_LIC_INFO) && NOT_INFILE(_LT_INTEL_7) &&
1752  (URL_INFILE(_URL_GPL_1) ||
1753  URL_INFILE(_URL_GPL_2) ||
1754  URL_INFILE(_URL_GPL_3))) {
1755  cp = GPLVERS();
1756  INTERESTING(lDebug ? "GPL(url)" : cp);
1757  lmem[_mGPL] = 1;
1758  }
1759  else if (URL_INFILE(_URL_AGPL)) {
1760  cp = AGPLVERS();
1761  INTERESTING(lDebug ? "Affero(url)" : cp);
1762  lmem[_mGPL] = 1;
1763  }
1764  else if (!ltsr[_LT_LGPL_3] && INFILE(_LT_GPL_OR)) {
1765  cp = GPLVERS();
1766  INTERESTING(lDebug ? "GPL(or)" : cp);
1767  lmem[_mGPL] = 1;
1768  }
1769  else if (!lmem[_mGPL] && !lmem[_mLGPL] &&
1770  (INFILE(_LT_GNU_1) + INFILE(_LT_GNU_2) +
1771  INFILE(_LT_GNU_3) + INFILE(_LT_GNU_4) > 2)) {
1772  cp = GPLVERS();
1773  INTERESTING(lDebug ? "GPL(GNU)" : cp);
1774  lmem[_mGPL] = 1;
1775  }
1776  else if (!lmem[_mGPL] && !lmem[_mLGPL] &&
1777  INFILE(_LT_SEE_GPL) && INFILE(_LT_RECV_GPL)) {
1778  cp = GPLVERS();
1779  INTERESTING(lDebug ? "GPL(see)" : cp);
1780  lmem[_mGPL] = 1;
1781  }
1782  else if (!lmem[_mGPL] && !lmem[_mLGPL] &&
1783  INFILE(_LT_SEE_LGPL) && INFILE(_LT_RECV_LGPL)) {
1784  cp = LGPLVERS();
1785  INTERESTING(lDebug ? "LGPL(see)" : cp);
1786  lmem[_mLGPL] = 1;
1787  }
1788  }
1789  if (!lmem[_mGFDL] && (INFILE(_LT_GFDLref1) ||
1790  INFILE(_TITLE_GFDL))) {
1791  cp = GFDLVERS();
1792  INTERESTING(lDebug ? "GFDL(#2)" : cp);
1793  lmem[_mGFDL] = 1;
1794  }
1795  /*
1796  * Listed _explictly_ as an exception to the GPL -- this is NOT an 'else'
1797  * clause!
1798  */
1799  if (!lmem[_mGPL] && INFILE(_PHR_GPL_DESCRIPTIONS)) {
1800  INTERESTING(lDebug ? "GPL-kinda" : "GPL");
1801  lmem[_mGPL] = 1;
1802  }
1803  /* checking for FSF */
1804  if (INFILE(_LT_FSF_1)) {
1805  INTERESTING(lDebug ? "FSF(1)" : "FSFULLR");
1806  lmem[_mLGPL] = 1;
1807  }
1808  else if (INFILE(_LT_FSF_2)) {
1809  INTERESTING(lDebug ? "FSF(2)" : "FSF");
1810  }
1811  else if (INFILE(_LT_FSF_3)) {
1812  INTERESTING(lDebug ? "FSF(3)" : "FSF");
1813  }
1814  else if (mCR_FSF() && INFILE(_LT_FSF_4)) {
1815  INTERESTING(lDebug ? "FSF(4)" : "FSF");
1816  }
1817  else if (!lmem[_mGPL] && mCR_FSF() && INFILE(_LT_FSF_5)) {
1818  INTERESTING(lDebug ? "FSF(5)" : "FSF");
1819  }
1820  else if (!lmem[_mGPL] && INFILE(_LT_FSFUL)) {
1821  INTERESTING("FSFUL");
1822  }
1823  else if (!lmem[_mGPL] && NOT_INFILE(_LT_Autoconf_exception_20) && INFILE(_LT_FSFref1)) {
1824  INTERESTING(lDebug ? "FSF(ref1)" : "FSF");
1825  }
1826  else if (INFILE(_LT_FSFref2)) {
1827  INTERESTING(lDebug ? "FSF(ref2)" : "FSF");
1828  }
1829  else if (INFILE(_LT_LGPLrefFSF) &&
1830  NOT_INFILE(_PHR_NOT_UNDER_LGPL)) {
1831  INTERESTING(lDebug ? "LGPL(FSF)" : "LGPL");
1832  lmem[_mLGPL] = 1;
1833  }
1834  if (!lmem[_mGPL] && !lmem[_mLGPL] && !lmem[_mGFDL]) {
1835  /*
1836  * Check these patterns AFTER checking for FSF and GFDL, and only if the
1837  * CUPS license isn't present.
1838  */
1839  if (!lmem[_mCUPS] ) {
1840  if (GPL_INFILE(_LT_GPLpatt1) &&
1841  NOT_INFILE(_PHR_NOT_UNDER_LGPL)) {
1842  cp = GPLVERS();
1843  INTERESTING(lDebug ? "GPL(patt1)" : cp);
1844  lmem[_mGPL] = 1;
1845  }
1846  else if (GPL_INFILE(_LT_GPLpatt2)) {
1847  cp = GPLVERS();
1848  INTERESTING(lDebug ? "GPL(patt2)" : cp);
1849  lmem[_mGPL] = 1;
1850  }
1851  else if (INFILE(_CR_rms) && INFILE(_LT_GPL_2)) {
1852  INTERESTING("GPL(rms)");
1853  lmem[_mGPL] = 1;
1854  }
1855  else if (INFILE(_PHR_GPLISH_SAMPLE)) {
1856  INTERESTING(lDebug ? "GPLISH" : "GPL-possibility");
1857  INTERESTING(lDebug ? "GPLISH" : "LGPL-possibility");
1858  lmem[_mLGPL] = lmem[_mGPL] = 1;
1859  }
1860  }
1861  }
1862  else if (INFILE(_LT_GNU_COPYLEFT)) {
1863  INTERESTING("GNU-copyleft");
1864  lmem[_fGPL] = 1;
1865  }
1866  lmem[_fGPL] = lmem[_mLGPL]+lmem[_mGPL]+lmem[_mGFDL];
1867  }
1869  if (!lmem[_mGPL] && INFILE(_LT_GNU_PROJECTS)) {
1870  cp = GPLVERS();
1871  INTERESTING(lDebug ? "GPL(proj)" : cp);
1872  lmem[_mGPL] = 1;
1873  }
1875  if (HASTEXT(_LT_GPL_V2_NAMED_later, REG_EXTENDED) || HASTEXT(_TITLE_GPL2_ref1_later, REG_EXTENDED))
1876  {
1877  INTERESTING(lDebug ? "GPLV2+(named)" : "GPL-2.0-or-later");
1878  lmem[_mGPL] = 1;
1879  }
1880  else if (INFILE(_LT_TAPJOY) || INFILE(_LT_TAPJOY_ref1)) {
1881  INTERESTING("Tapjoy");
1882  lmem[_fGPL] = 1;
1883  lmem[_mMIT] = 1;
1884  }
1885  else if (!lmem[_mGPL] && !lmem[_mGFDL] && !lmem[_mLGPL] && !lmem[_fZPL]
1886  && (INFILE(_LT_GPL_NAMED)
1887  || INFILE(_LT_GPL_NAMED2)
1888  || HASTEXT(_LT_GPL_NAMED3, REG_EXTENDED))
1889  && !HASTEXT(_PHR_GPL_GHOSTSCRIPT, REG_EXTENDED)
1890  && NOT_INFILE(_LT_MPL_SECONDARY)
1891  && NOT_INFILE(_TEXT_NOT_GPL)
1892  && NOT_INFILE(_TEXT_NOT_GPL2)
1893  && NOT_INFILE(_LT_CNRI_PYTHON_GPL)
1894  && NOT_INFILE(_LT_W3Cref4)
1895  && NOT_INFILE(_LT_GPL_NAMED3_EXHIBIT)
1896  && NOT_INFILE(_LT_GPL_NAMED_COMPATIBLE)
1897  && !HASTEXT(_LT_GPL_NAMED_COMPATIBLE_1, REG_EXTENDED)
1898  && NOT_INFILE(_LT_GPL_NAMED_EXHIBIT)
1899  && NOT_INFILE(_TITLE_D_FSL_10)
1900  && NOT_INFILE(_LT_INTEL_7)
1901  && NOT_INFILE(_PHR_GPL_COMPAT_3)) {
1902  cp = GPLVERS();
1903  INTERESTING(lDebug ? "GPL(named)" : cp);
1904  lmem[_mGPL] = 1;
1905  }
1906  else if ( !lmem[_mGPL] && !INFILE(_TITLE_MIROS) && (INFILE(_LT_GPL_V2_NAMED) || INFILE(_LT_GPL_V2_NAMED_ref1)))
1907  {
1908  INTERESTING(lDebug ? "GPLV2(named)" : "GPL-2.0-only");
1909  lmem[_mGPL] = 1;
1910  }
1911  else if (!lmem[_mGPL] && INFILE(_LT_GPL_V3_NAMED_later))
1912  {
1913  INTERESTING(lDebug ? "GPLV3(named_later)" : "GPL-3.0-or-later");
1914  }
1915  else if (!lmem[_mGPL] && INFILE(_LT_GPL_V3_NAMED))
1916  {
1917  INTERESTING(lDebug ? "GPLV3(named)" : "GPL-3.0-only");
1918  }
1920  if (!lmem[_mLGPL] && (INFILE(_LT_LGPL_NAMED)
1921  || INFILE(_LT_LGPL_NAMED2)) && NOT_INFILE(_LT_GPL_NAMED_EXHIBIT)
1922  && NOT_INFILE(_LT_PHP_V30_2)) {
1923  cp = LGPLVERS();
1924  INTERESTING(lDebug ? "LGPL(named)" : cp);
1925  }
1926 
1928  /*
1929  * MIT, X11, Open Group, NEC -- text is very long, search in 2 parts
1930  */
1931  if (INFILE(_LT_JSON) && INFILE(_LT_MIT_NO_EVIL)) { // JSON license
1932  INTERESTING("JSON");
1933  lmem[_mMIT] = 1;
1934  }
1936  if (!lmem[_mWORDNET] && INFILE(_TITLE_WORDNET))
1937  {
1938  INTERESTING("WordNet-3.0");
1939  }
1941  if (INFILE(_CR_XFREE86_V10) || INFILE(_LT_XFREE86_V10)) {
1942  INTERESTING("XFree86-1.0");
1943  lmem[_mMIT] = 1;
1944  }
1945  else if (INFILE(_CR_XFREE86_V11) || INFILE(_LT_XFREE86_V11)) {
1946  INTERESTING("XFree86-1.1");
1947  lmem[_mMIT] = 1;
1948  }
1949  else if (INFILE(_LT_XFREE86)) {
1950  INTERESTING(lDebug ? "XFree86(1)" : "XFree86");
1951  lmem[_mMIT] = 1;
1952  }
1953  else if (HASTEXT(_LT_BSD_OR_MIT, REG_EXTENDED)) {
1954  INTERESTING("MIT");
1955  INTERESTING("BSD");
1956  lmem[_mMIT] = 1;
1957  }
1958  else if (HASTEXT(_LT_BSD_AND_MIT, REG_EXTENDED)) {
1959  INTERESTING("BSD");
1960  INTERESTING("MIT");
1961  lmem[_mMIT] = 1;
1962  }
1963  /*
1964  * MIT search order changed. First MIT license explicit phrases and references are checked .
1965  */
1966  else if (!lmem[_mMIT] && NOT_INFILE(_TITLE_MIT_EXHIBIT) && NOT_INFILE(_TITLE_SGI) &&
1967  (INFILE(_LT_MIT_1) || INFILE(_TITLE_MIT))) {
1968  if(INFILE(_LT_MIT_NO_EVIL)) {
1969  INTERESTING(lDebug ? "MIT-style(no evil)" : "JSON");
1970  lmem[_mMIT] = 1;
1971  }
1972  else if (INFILE(_LT_MIT_2)) {
1973  if (mCR_MIT() || INFILE(_TITLE_MIT)) {
1974  INTERESTING(lDebug ? "MIT(1)" : "MIT");
1975  lmem[_mMIT] = 1;
1976  }
1977  else if (INFILE(_TITLE_XNET)) {
1978  INTERESTING("Xnet");
1979  lmem[_mMIT] = 1;
1980  }
1981  else if (INFILE(_CR_X11) || INFILE(_TITLE_X11)) {
1982  INTERESTING(lDebug ? "X11(1)" : "X11");
1983  lmem[_mMIT] = 1;
1984  }
1985  else if (INFILE(_CR_XFREE86)) {
1986  INTERESTING(lDebug ? "XFree86(2)" : "XFree86");
1987  lmem[_mMIT] = 1;
1988  }
1989  /* MIT-advertising License */
1990  else if (INFILE(_LT_MIT_ADVERTISING)) {
1991  INTERESTING("MIT-advertising");
1992  lmem[_mMIT] = 1;
1993  }
1994  /* MIT-enna License */
1995  else if (INFILE(_LT_MIT_ENNA)) {
1996  INTERESTING("MIT-enna");
1997  lmem[_mMIT] = 1;
1998  }
1999  /* MIT-feh License */
2000  else if (INFILE(_LT_MIT_FEH)) {
2001  INTERESTING("MIT-feh");
2002  lmem[_mMIT] = 1;
2003  }
2004  /* MITNFA License */
2005  else if (HASTEXT(_LT_MITNFA, 0)) {
2006  INTERESTING("MITNFA");
2007  lmem[_mMIT] = 1;
2008  }
2009  /* Imlib2 License */
2010  else if (INFILE(_LT_Imlib2)) {
2011  INTERESTING("Imlib2");
2012  lmem[_mMIT] = 1;
2013  }
2014  else if (INFILE(_LT_MIT_13)) {
2015  INTERESTING(lDebug ? "MIT(14)" : "MIT");
2016  lmem[_mMIT] = 1;
2017  }
2018  /* NCSA */
2019  else if (INFILE(_TITLE_NCSA) && NOT_INFILE(_TITLE_NCSA_EXHIBIT)) {
2020  INTERESTING(lDebug ? "NCSA(1)" : "NCSA");
2021  lmem[_mMIT] = 1;
2022  lmem[_fNCSA] = 1;
2023  }
2024  else if (INFILE(_LT_MIT_0)) {
2025  INTERESTING("MIT-0");
2026  lmem[_mMIT] = 1;
2027  }
2028  else if (NOT_INFILE(_LT_INTEL_7)) {
2029  INTERESTING(lDebug ? "MIT-style(1)" : "MIT-style");
2030  lmem[_mMIT] = 1;
2031  }
2032  }
2033  else if (INFILE(_LT_BITSTREAM_1)) {
2034  INTERESTING(lDebug ? "Bitstream(1)" : "Bitstream");
2035  lmem[_mMIT] = 1;
2036  }
2037  else if (mCR_X11()) {
2038  INTERESTING(lDebug ? "X11(2)" : "X11");
2039  }
2040  else if (!lmem[_mMPL] && INFILE(_LT_MPL_1)) {
2041  cp = MPLVERS(); /* NPL, too */
2042  INTERESTING(lDebug ? "MPL/NPL#5" : cp);
2043  lmem[_mMPL] = 1;
2044  }
2045  else if (!lmem[_mMIT] && (mCR_MIT() || INFILE(_TITLE_MIT)) && NOT_INFILE(_TITLE_MIT_EXHIBIT)) {
2046  INTERESTING(lDebug ? "MIT(2)" : "MIT");
2047  lmem[_mMIT] = 1;
2048  }
2049  /*
2050  * BOOST (relatively new, circa August 2003)
2051  * hmm, some references have a Copyright Notre Dame, some don't
2052  */
2053  else if (INFILE(_LT_BOOST_1)) {
2054  if (INFILE(_TITLE_BOOST10)) {
2055  INTERESTING("BSL-1.0");
2056  }
2057  else if (INFILE(_CR_NOTREDAME)) {
2058  INTERESTING(lDebug ? "Boost(ND)" : "BSL-1.0");
2059  }
2060  else if (INFILE(_TITLE_BOOST)) {
2061  INTERESTING("BSL-1.0");
2062  }
2063  else {
2064  INTERESTING("BSL-style");
2065  }
2066  }
2067  else if (mCR_MIT()) {
2068  INTERESTING(lDebug ? "MIT(3)" : "MIT");
2069  lmem[_mMIT] = 1;
2070  }
2071  else if (INFILE(_TITLE_ICU) || HASTEXT(_URL_ICU, REG_EXTENDED)) {
2072  INTERESTING(lDebug ? "MIT-style(ICU)" : "ICU");
2073  lmem[_mMIT] = 1;
2074  }
2075  else if (INFILE(_LT_ICU_2) && (INFILE(_CR_IBM_1) || INFILE(_CR_IBM_1))) {
2076  INTERESTING(lDebug ? "MIT-style(ICU)" : "ICU");
2077  lmem[_mMIT] = 1;
2078  }
2079  else if (INFILE(_TITLE_JasPer_20)) {
2080  INTERESTING(lDebug ? "JasPer(title)" : "JasPer-2.0");
2081  lmem[_mMIT] = 1;
2082  }
2083  else if (INFILE(_LT_UNICODE_4)) {
2084  INTERESTING(lDebug ? "MIT-style(Unicode)" : "Unicode");
2085  lmem[_fUNICODE] = 1;
2086  lmem[_mMIT] = 1;
2087  }
2088  /*
2089  * Adobe-Glyph
2090  */
2091  else if (HASTEXT(_LT_ADOBE_GLYPH_1, REG_EXTENDED) && INFILE(_LT_ADOBE_GLYPH_2)) {
2092  INTERESTING("Adobe-Glyph");
2093  }
2094  /*
2095  * Ubuntu Font
2096  */
2097  else if (INFILE(_LT_UBUNTU_FONT)) {
2098  INTERESTING("ubuntu-font-1.0");
2099  }
2100  /*
2101  * OFL license text has MIT license warranty claims which is identifed as MIT-style
2102  */
2103  else if (!lmem[_fOFL]) {
2104  INTERESTING(lDebug ? "MIT-style(2)" : "MIT-style");
2105  lmem[_mMIT] = 1;
2106  }
2107  }
2108  /*
2109  * Secondly X11 and MIT style phrases are checked.
2110  */
2111  else if (INFILE(_LT_MIT_0) && (INFILE(_LT_MIT_2) || INFILE(_LT_MIT_3) || INFILE(_LT_MIT_4) ||
2112  INFILE(_LT_MIT_5) || INFILE(_LT_MIT_6) || INFILE(_LT_MIT_7))) {
2113  if(INFILE(_LT_MIT_NO_EVIL)) {
2114  INTERESTING(lDebug ? "MIT-style(no evil)" : "JSON");
2115  lmem[_mMIT] = 1;
2116  }
2117  else if (INFILE(_LT_X11_5)) {
2118  if (INFILE(_CR_XFREE86)) {
2119  INTERESTING(lDebug ? "XFree86(3)" : "XFree86");
2120  }
2121  else {
2122  INTERESTING(lDebug ? "X11(3)" : "X11");
2123  }
2124  lmem[_mMIT] = 1;
2125  }
2126  else if (INFILE(_LT_Xnet_STYLE)) {
2127  INTERESTING("Xnet");
2128  lmem[_mMIT] = 1;
2129  }
2130  else if (INFILE(_LT_TAPJOY)) {
2131  INTERESTING("Tapjoy");
2132  lmem[_mMIT] = 1;
2133  }
2134  else {
2135  /*
2136  * SPDX defines curl license. It has very typical MIT-style text. The only way to
2137  * identify it is to use copyright or copyright reference.
2138  */
2139  if (INFILE(_CR_CURL)) {
2140  INTERESTING("curl");
2141  }
2142  else {
2143  INTERESTING(lDebug ? "MIT-style(7)" : "MIT-style");
2144  }
2145  lmem[_mMIT] = 1;
2146  }
2147  }
2148  else if (INFILE(_LT_MIT_5)) {
2149  if (mCR_MIT()) {
2150  INTERESTING(lDebug ? "MIT(4)" : "MIT");
2151  }
2152  else {
2153  INTERESTING(lDebug ? "MIT-style(3)" : "MIT-style");
2154  }
2155  lmem[_mMIT] = 1;
2156  }
2158  /*
2159  * Open Group, NEC, MIT use the same text in licenses
2160  */
2161  if (INFILE(_LT_MIT_6)) {
2162  if (!lmem[_mMIT] && INFILE(_CR_OpenGroup)) {
2163  INTERESTING(lDebug ? "OpenGroup(1)" : "OpenGroup");
2164  lmem[_mMIT] = 1;
2165  }
2166  else if (!lmem[_mCMU] && mCR_CMU()) {
2167  INTERESTING(lDebug ? "CMU(2)" : "CMU");
2168  lmem[_mCMU] = 1;
2169  }
2170  else if (!lmem[_mMIT] && mCR_MIT()) {
2171  INTERESTING(lDebug ? "MIT(6)" : "MIT");
2172  lmem[_mMIT] = 1;
2173  }
2174  else if (!lmem[_mMIT] && INFILE(_LT_HPND_1) && INFILE(_LT_HPND_2)) {
2175  INTERESTING("HPND-sell-variant");
2176  lmem[_mMIT] = 1;
2177  }
2178  /*
2179  * _LT_MIT_6 is very similar to _LT_BSD_2 where MIT-CMU licenses
2180  * are also detected. Following else if is the copy from there.
2181  */
2182  else if (!lmem[_mMIT] && INFILE(_LT_CMU_7)) {
2183  if (INFILE(_CR_CMU_1) || INFILE(_CR_CMU_2) || INFILE(_CR_BSDCAL)) {
2184  INTERESTING("MIT-CMU");
2185  }
2186  else {
2187  INTERESTING("MIT-CMU-style");
2188  }
2189  lmem[_mCMU] = 1;
2190  }
2191  else if (!lmem[_mMIT]) {
2192  INTERESTING(lDebug ? "MIT-style(4)" : "MIT-style");
2193  lmem[_mMIT] = 1;
2194  }
2195  }
2196  else if (INFILE(_SPDX_MIT_0)) {
2197  INTERESTING("MIT-0");
2198  }
2199  else if (INFILE(_SPDX_MIT_advertising)) {
2200  INTERESTING("MIT-advertising");
2201  }
2202  else if (INFILE(_SPDX_MIT_enna)) {
2203  INTERESTING("MIT-enna");
2204  }
2205  else if (INFILE(_SPDX_MIT_feh)) {
2206  INTERESTING("MIT-feh");
2207  }
2208  else if (!lmem[_mMIT] && INFILE(_LT_MIT_7)) {
2209  if (INFILE(_CR_OpenGroup)) {
2210  INTERESTING(lDebug ? "OpenGroup(2)" : "OpenGroup");
2211  }
2212  else if (!lmem[_mMIT] && mCR_MIT()) {
2213  INTERESTING(lDebug ? "MIT(7)" : "MIT");
2214  lmem[_mMIT] = 1;
2215  }
2216  else {
2217  INTERESTING(lDebug ? "MIT-style(5)" : "MIT-style");
2218  lmem[_mMIT] = 1;
2219  }
2220  }
2221  else if ((!lmem[_mMIT] || mCR_MIT()) && INFILE(_LT_MITref1)) {
2222  INTERESTING(lDebug ? "MIT(ref1)" : "MIT");
2223  lmem[_mMIT] = 1;
2224  }
2225  else if (!lmem[_mMIT] && INFILE(_LT_MITref2)) {
2226  INTERESTING(lDebug ? "MIT(ref2)" : "MIT");
2227  lmem[_mMIT] = 1;
2228  }
2229  else if (!lmem[_mMIT] && INFILE(_LT_MITref6)) {
2230  INTERESTING(lDebug ? "MIT(ref6)" : "MIT");
2231  lmem[_mMIT] = 1;
2232  }
2233  else if (!lmem[_mMIT] && INFILE(_LT_MITref3)) {
2234  INTERESTING(lDebug ? "MIT(ref3)" : "MIT-style");
2235  lmem[_mMIT] = 1;
2236  }
2237  else if (!lmem[_mMIT] && INFILE(_LT_MITref4)) {
2238  INTERESTING(lDebug ? "MIT(ref4)" : "MIT");
2239  lmem[_mMIT] = 1;
2240  }
2241  else if (!lmem[_mMIT] && (INFILE(_LT_MITref5) || INFILE(_LT_MITref9))) {
2242  INTERESTING(lDebug ? "MIT(ref5)" : "MIT");
2243  lmem[_mMIT] = 1;
2244  }
2245  else if (INFILE(_SPDX_MIT_CMU)) {
2246  INTERESTING("MIT-CMU");
2247  }
2248  else if (!lmem[_fREAL] && (INFILE(_SPDX_MIT))) {
2249  INTERESTING(lDebug ? "MIT(SPDX)" : "MIT");
2250  }
2251  else if (!lmem[_mMIT] && !lmem[_fREAL] && INFILE(_LT_MITref7)) {
2252  INTERESTING(lDebug ? "MIT(ref7)" : "MIT");
2253  lmem[_mMIT] = 1;
2254  }
2255  else if (!lmem[_mMIT] && INFILE(_LT_MITref8)) {
2256  INTERESTING(lDebug ? "MIT(ref8/9)" : "MIT");
2257  lmem[_mMIT] = 1;
2258  }
2259  else if (INFILE(_LT_OpenGroup_1)) {
2260  if (INFILE(_CR_OpenGroup)) {
2261  INTERESTING(lDebug ? "OpenGroup(3)" : "OpenGroup");
2262  }
2263  else {
2264  INTERESTING(lDebug ? "OG-style(3)" : "OpenGroup-style");
2265  }
2266  }
2267  else if (INFILE(_LT_OpenGroup_3)) {
2268  if (INFILE(_CR_OpenGroup)) {
2269  INTERESTING(lDebug ? "OpenGroup(5)" : "OpenGroup");
2270  }
2271  else {
2272  INTERESTING(lDebug ? "OG-style(5)" : "OpenGroup-style");
2273  }
2274  }
2275  else if (INFILE(_LT_OpenGroup_PROP)) {
2276  if (!lmem[_mXOPEN] && INFILE(_CR_XOPEN)) {
2277  INTERESTING("XOPEN-EULA");
2278  lmem[_mXOPEN] = 1;
2279  }
2280  else if (INFILE(_CR_OpenGroup)) {
2281  INTERESTING("OpenGroup-Proprietary");
2282  }
2283  else {
2284  INTERESTING("Proprietary");
2285  }
2286  }
2287  else if (INFILE(_LT_X11_1)) {
2288  if (mCR_X11()) {
2289  INTERESTING(lDebug ? "X11(4)" : "X11");
2290  }
2291  else {
2292  INTERESTING(lDebug ? "X11-style(2)" : "X11-style");
2293  }
2294  }
2295  else if (INFILE(_LT_X11_2)) {
2296  if (mCR_X11()) {
2297  INTERESTING(lDebug ? "X11(5)" : "X11");
2298  }
2299  else {
2300  INTERESTING(lDebug ? "X11-style(3)" : "X11-style");
2301  }
2302  }
2303  else if (INFILE(_LT_X11_3)) {
2304  if (mCR_X11()) {
2305  INTERESTING(lDebug ? "X11(6)" : "X11");
2306  }
2307  /*
2308  * Unix System Laboratories
2309  */
2310  else if (INFILE(_CR_USL_EUR)) {
2311  INTERESTING(lDebug ? "USLE(2)" : "USL-Europe");
2312  }
2313  else {
2314  INTERESTING(lDebug ? "X11-style(4)" : "X11-style");
2315  }
2316  }
2317  else if (INFILE(_LT_X11_4)) {
2318  if (mCR_X11()) {
2319  INTERESTING(lDebug ? "X11(7)" : "X11");
2320  }
2321  else {
2322  INTERESTING(lDebug ? "X11-style(5)" : "X11-style");
2323  }
2324  }
2325  else if (INFILE(_PHR_X11_1) || INFILE(_PHR_X11_2)) {
2326  INTERESTING(lDebug ? "PHR(X11)" : "X11");
2327  }
2328  else if (INFILE(_LT_X11_STYLE)) {
2329  INTERESTING(lDebug ? "X11-style(6)" : "X11-style");
2330  }
2331  /*
2332  * ISC License
2333  */
2334  if (INFILE(_PHR_ISC_1) || INFILE(_PHR_ISC_2) || HASTEXT(_URL_ISC, REG_EXTENDED)) {
2335  INTERESTING(lDebug ? "PHR(ISC)" : "ISC");
2336  lmem[_mISC] = 1;
2337  }
2338  else if (INFILE(_LT_MIT_4) && INFILE(_PHR_NO_WARRANTY_12)) {
2339  INTERESTING(lDebug ? "ISC(MIT-style(4))" : "ISC");
2340  lmem[_mISC] = 1;
2341  }
2342  else if (INFILE(_LT_MIT_8) && INFILE(_CR_ISC)) {
2343  INTERESTING(lDebug ? "ISC(MIT-style(8))" : "ISC");
2344  lmem[_mISC] = 1;
2345  }
2347  /*
2348  * NTP License, note that NTP license text is detected with _LT_BSD_2
2349  */
2350  if (INFILE(_TITLE_NTP)) {
2351  INTERESTING("NTP");
2352  lmem[_mNTP] = 1;
2353  }
2355  /* MirOS License (MirOS) */
2356  if (INFILE(_TITLE_MIROS)) {
2357  INTERESTING("MirOS");
2358  lmem[_mMIT] = 1;
2359  }
2361  /* Libpng license */
2362  if (INFILE(_TITLE_LIBPNG)) {
2363  INTERESTING("Libpng");
2364  }
2365  else if (INFILE(_LT_W3C_1)) {
2366  if (INFILE(_CR_W3C)) {
2367  INTERESTING(lDebug ? "W3C(1)" : "W3C");
2368  }
2369  else {
2370  INTERESTING(lDebug ? "W3C-style(1)" : "W3C-style");
2371  }
2372  lmem[_fW3C] = 1;
2373  }
2374  else if (!lmem[_mNTP] && !lmem[_mPYTHON] && !lmem[_fBSD] && INFILE(_LT_W3C_2)) {
2375  if (INFILE(_LT_W3C_19980720)) {
2376  INTERESTING("W3C-19980720");
2377  }
2378  else if (INFILE(_CR_W3C)) {
2379  INTERESTING(lDebug ? "W3C(2)" : "W3C");
2380  }
2381  else {
2382  INTERESTING(lDebug ? "W3C-style(2)" : "W3C-style");
2383  }
2384  lmem[_fW3C] = 1;
2385  }
2386  else if (INFILE(_LT_W3C_3)) {
2387  if (INFILE(_LT_W3C_8)) {
2388  if (INFILE(_LT_W3C_20021231)) {
2389  INTERESTING("W3C");
2390  }
2391  else if (INFILE(_LT_W3C_20150513)) {
2392  INTERESTING("W3C-20150513");
2393  }
2394  }
2395  else if (INFILE(_CR_W3C)) {
2396  INTERESTING(lDebug ? "W3C(3)" : "W3C");
2397  }
2398  else if (INFILE(_LT_W3Cref4)) {
2399  INTERESTING(lDebug ? "W3C(ref4)" : "W3C");
2400  }
2401  else {
2402  INTERESTING(lDebug ? "W3C-style(3)" : "W3C-style");
2403  }
2404  lmem[_fW3C] = 1;
2405  }
2406  else if (INFILE(_LT_W3C_4) && NOT_INFILE(_LT_PNG_ZLIB_2)) {
2407  if (INFILE(_CR_W3C)) {
2408  INTERESTING(lDebug ? "W3C(4)" : "W3C");
2409  }
2410  else {
2411  INTERESTING(lDebug ? "W3C-style(4)" : "W3C-style");
2412  }
2413  lmem[_fW3C] = 1;
2414  }
2415  else if (INFILE(_LT_W3C_5)) {
2416  if (INFILE(_CR_W3C)) {
2417  INTERESTING(lDebug ? "W3C(5)" : "W3C");
2418  }
2419  else {
2420  INTERESTING(lDebug ? "W3C-style(5)" : "W3C-style");
2421  }
2422  lmem[_fW3C] = 1;
2423  }
2424  else if (INFILE(_LT_W3C_6)) {
2425  if (INFILE(_CR_W3C)) {
2426  INTERESTING(lDebug ? "W3C(6)" : "W3C");
2427  }
2428  else {
2429  INTERESTING(lDebug ? "W3C-style(6)" : "W3C-style");
2430  }
2431  lmem[_fW3C] = 1;
2432  }
2433  else if (INFILE(_LT_W3C_7)) {
2434  if (INFILE(_CR_W3C)) {
2435  INTERESTING(lDebug ? "W3C(7)" : "W3C");
2436  }
2437  else if (INFILE(_LT_OGC)) {
2438  INTERESTING("OGC");
2439  }
2440  else {
2441  INTERESTING(lDebug ? "W3C-style(7)" : "W3C-style");
2442  }
2443  lmem[_fW3C] = 1;
2444  }
2445  else if (INFILE(_LT_W3Cref1)) {
2446  INTERESTING(lDebug ? "W3C(ref1)" : "W3C");
2447  lmem[_fW3C] = 1;
2448  }
2449  else if (INFILE(_LT_W3Cref2)) {
2450  INTERESTING(lDebug ? "W3C(ref2)" : "W3C");
2451  lmem[_fW3C] = 1;
2452  }
2453  else if (INFILE(_LT_W3Cref3)) {
2454  INTERESTING(lDebug ? "W3C(ref3)" : "W3C");
2455  lmem[_fW3C] = 1;
2456  }
2457  else if (INFILE(_LT_W3Cref4)) {
2458  INTERESTING(lDebug ? "W3C(ref4)" : "W3C");
2459  lmem[_fW3C] = 1;
2460  }
2461  else if (URL_INFILE(_URL_W3C_20021231)) {
2462  INTERESTING(lDebug ? "W3C-20021231(url)" : "W3C");
2463  lmem[_fW3C] = 1;
2464  }
2465  else if (URL_INFILE(_URL_W3C_IP)) {
2466  INTERESTING(lDebug ? "W3C-IP(url)" : "W3C-IP");
2467  lmem[_fW3C] = 1;
2468  }
2469  else if (URL_INFILE(_URL_W3C)) {
2470  INTERESTING(lDebug ? "W3C(url)" : "W3C");
2471  lmem[_fW3C] = 1;
2472  }
2473  else if (!lmem[_mMIT] && INFILE(_LT_MIT_3)) {
2474  if (INFILE(_LT_NTP_0)) {
2475  INTERESTING("NTP-0");
2476  }
2477  else if (mCR_MIT()) {
2478  INTERESTING(lDebug ? "MIT(8)" : "MIT");
2479  }
2480  else {
2481  INTERESTING(lDebug ? "MIT-style(6)" : "MIT-style");
2482  }
2483  lmem[_mMIT] = 1;
2484  }
2485  else if (!lmem[_mMIT] && INFILE(_LT_MIT_4)) {
2486  if (mCR_MIT()) {
2487  INTERESTING(lDebug ? "MIT(9)" : "MIT");
2488  }
2489  else if (!lmem[_mISC] && mCR_FSF()) {
2490  INTERESTING(lDebug ? "FSF(7)" : "FSF");
2491  }
2492  else if (!lmem[_mISC]) {
2493  INTERESTING(lDebug ? "MIT-style(13)" : "MIT-style");
2494  }
2495  lmem[_mMIT] = 1;
2496  }
2497  else if (!lmem[_mMIT] && INFILE(_LT_MIT_8)) {
2498  if (INFILE(_CR_VIXIE)) {
2499  INTERESTING("Vixie");
2500  }
2501  else if (INFILE(_LT_0BSD)) {
2502  INTERESTING("0BSD");
2503  }
2504  else if (mCR_MIT()) {
2505  INTERESTING(lDebug ? "MIT(10)" : "MIT");
2506  }
2507  else if (HASTEXT(_TEXT_TU_BERLIN, 0) && HASTEXT(_LT_FREE_87,0)) {
2508  INTERESTING("TU-Berlin-2.0");
2509  }
2510  else {
2511  INTERESTING(lDebug ? "MIT-style(8)" : "MIT-style");
2512  }
2513  lmem[_mMIT] = 1;
2514  }
2515  else if (INFILE(_LT_MIT_9)) {
2516  if (INFILE(_CR_SLEEPYCAT)) {
2517  MEDINTEREST(lDebug ? "Sleepycat(2)" : "Sleepycat");
2518  }
2519  else if (INFILE(_CR_BSDCAL)) {
2520  INTERESTING(lDebug ? "BSD(mit)" : "BSD");
2521  lmem[_fBSD] = 1;
2522  }
2523  else if (INFILE(_CR_SUN)) {
2524  INTERESTING(lDebug ? "SUN(mit)" : "SUN");
2525  lmem[_fBSD] = 1;
2526  }
2527  else if (!lmem[_mMIT] && mCR_MIT()) {
2528  INTERESTING(lDebug ? "MIT(11)" : "MIT");
2529  lmem[_mMIT] = 1;
2530  }
2531  else if (!lmem[_mMIT]) {
2532  /*
2533  * Tcl/Tk license has MIT phrase
2534  */
2535  if (INFILE(_LT_TCL)) {
2536  INTERESTING("TCL");
2537  lmem[_fTCL] = 1;
2538  }
2539  else {
2540  INTERESTING(lDebug ? "MIT-style(9)" : "MIT-style");
2541  lmem[_mMIT] = 1;
2542  }
2543  }
2544  }
2545  else if (INFILE(_LT_MIT_10)) {
2546  if (!lmem[_mMIT] && mCR_MIT()) {
2547  INTERESTING(lDebug ? "MIT(12)" : "MIT");
2548  lmem[_mMIT] = 1;
2549  }
2550  else {
2551  INTERESTING(lDebug ? "MIT-style(10)" : "MIT-style");
2552  lmem[_mMIT] = 1;
2553  }
2554  }
2555  else if ((INFILE(_LT_MIROS_PREAMBLE) || INFILE(_TITLE_MIROS)) && INFILE(_LT_MIT_11)) {
2556  INTERESTING(lDebug ? "MIT-style(MirOS)" : "MirOS");
2557  lmem[_mMIT] = 1;
2558  }
2559  else if (INFILE(_LT_MIT_11)) {
2560  INTERESTING(lDebug ? "MIT-style(11)" : "MIT-style");
2561  lmem[_mMIT] = 1;
2562  }
2563  else if (!lmem[_mMIT] && INFILE(_LT_MITDOC)) {
2564  if (mCR_MIT()) {
2565  INTERESTING(lDebug ? "MIT(13)" : "MIT");
2566  }
2567  else {
2568  INTERESTING(lDebug ? "MIT-style(12)" : "MIT-style");
2569  }
2570  lmem[_mMIT] = 1;
2571  }
2572  else if (!lmem[_mMIT] && INFILE(_LT_MIT_0) && NOT_INFILE(_LT_ECL)) {
2573  INTERESTING(lDebug ? "MIT(0)" : "MIT-style");
2574  lmem[_mMIT] = 1;
2575  }
2576  else if (INFILE(_LT_MIT_14)) {
2577  INTERESTING(lDebug ? "MIT-style(14)" : "MIT-style");
2578  lmem[_mMIT] = 1;
2579  }
2580  else if (INFILE(_LT_MIT_15)) {
2581  INTERESTING(lDebug ? "MIT-style(15)" : "ISC-style");
2582  lmem[_mMIT] = 1;
2583  }
2584  else if (INFILE(_LT_MPL_OR_MITX)) {
2585  if (!lmem[_mMPL]) {
2586  cp = MPLVERS();
2587  INTERESTING(lDebug ? "MPL(with-MIT)" : cp);
2588  lmem[_mMPL] = 1;
2589  }
2590  if (!lmem[_mMIT]) {
2591  INTERESTING(lDebug ? "MIT(with-MPL)" : "MIT");
2592  lmem[_mMIT] = 1;
2593  }
2594  }
2595  else if (!lmem[_mMIT] && (URL_INFILE(_URL_MIT) || URL_INFILE(_URL_MIT_ROCK))) {
2596  INTERESTING(lDebug ? "MIT(url)" : "MIT");
2597  lmem[_mMIT] = 1;
2598  }
2599  else if (HASTEXT(_TEXT_TU_BERLIN, 0) && HASTEXT(_LT_FREE_87,0)) {
2600  INTERESTING("TU-Berlin-1.0");
2601  }
2602  else if (INFILE(_LT_NIST_1) && INFILE(_LT_NIST_2)) {
2603  INTERESTING(lDebug ? "NIST" : "MIT-style");
2604  }
2605  else if (INFILE(_LT_FSFAP)) {
2606  INTERESTING("FSFAP");
2607  }
2609  /*
2610  * Generic CopyLeft licenses
2611  */
2612  if (INFILE(_LT_COPYLEFT_1)) {
2613  INTERESTING("CopyLeft[1]");
2614  }
2615  else if (INFILE(_LT_COPYLEFT_2)) {
2616  INTERESTING("CopyLeft[2]");
2617  }
2619  /*
2620  * OpenContent license
2621  */
2622  if (INFILE(_LT_OPENCONTENT)) {
2623  if (INFILE(_TITLE_OPENCL10)) {
2624  INTERESTING("OCL-1.0");
2625  }
2626  else if (INFILE(_TITLE_OPENCL)) {
2627  INTERESTING("OCL");
2628  }
2629  else {
2630  INTERESTING("OCL-style");
2631  }
2632  }
2634  /*
2635  * jpeg/netpbm and png/zlib and others...
2636  */
2637  if (INFILE(_TITLE_ZLIB)) {
2638  INTERESTING("Zlib");
2639  }
2640  else if (INFILE (_LT_TRUECRYPT_30)) {
2641  INTERESTING("TrueCrypt-3.0");
2642  }
2643  else if (INFILE(_TITLE_LIBPNG)) {
2644  INTERESTING("Libpng");
2645  }
2646  /* IJG */
2647  else if (INFILE(_LT_JPEG_1)) {
2648  INTERESTING(lDebug ? "JPEG(1)" : "IJG");
2649  lmem[_fIJG] = 1;
2650  }
2651  else if (INFILE(_LT_JPEG_2) && HASTEXT(_TITLE_IJG_2, 0)) {
2652  INTERESTING(lDebug ? "JPEG(2)" : "IJG");
2653  lmem[_fIJG] = 1;
2654  }
2655  /* Zlib */
2656  else if (INFILE(_SPDX_zlib_acknowledgement)) {
2657  INTERESTING("zlib-acknowledgement");
2658  }
2659  else if (!lmem[_fREAL] && (INFILE(_SPDX_Zlib))) {
2660  INTERESTING("Zlib");
2661  }
2662  else if (INFILE(_LT_PNG_ZLIB_1) && HASTEXT(_LT_PNG_ZLIB_CLAUSE_1, 0) && HASTEXT(_LT_PNG_ZLIB_CLAUSE_2, REG_EXTENDED) && HASTEXT(_LT_PNG_ZLIB_CLAUSE_3, 0)) {
2663  INTERESTING(lDebug ? "ZLIB(1)" : "Zlib");
2664  }
2665  else if (INFILE(_LT_PNG_ZLIBref4) && NOT_INFILE(_LT_PNG_ZLIBref4_EXHIBIT)) {
2666  INTERESTING(lDebug ? "ZLIB(6)" : "Zlib");
2667  }
2668  else if (!lmem[_fW3C] && INFILE(_LT_PNG_ZLIB_2)) {
2669  if (INFILE(_LT_libmng_2007_Clause_1)) {
2670  if (HASTEXT(_LT_libmng_2007_1, 0)) {
2671  INTERESTING("libmng-2007");
2672  }
2673  else if (INFILE(_LT_libpng_20_Clause_1)) {
2674  INTERESTING("libpng-2.0");
2675  }
2676  }
2677  else {
2678  INTERESTING(lDebug ? "PNG/ZLIB(2)" : "Libpng");
2679  }
2680  }
2681  else if (INFILE(_LT_PNG_ZLIBref1)) {
2682  INTERESTING(lDebug ? "ZLIB(3)" : "Zlib");
2683  }
2684  else if (INFILE(_LT_PNG_ZLIBref2)) {
2685  INTERESTING(lDebug ? "ZLIB(4)" : "Zlib");
2686  }
2687  else if (INFILE(_LT_PNG_ZLIBref3)) { /* might be zlib/libpng license, not sure */
2688  INTERESTING(lDebug ? "ZLIB(5)" : "Zlib-possibility");
2689  }
2690  else if (!LVAL(_TEXT_GNU_LIC_INFO) && (URL_INFILE(_URL_ZLIB_1) || URL_INFILE(_URL_ZLIB_2))) {
2691  INTERESTING(lDebug ? "ZLIB(url)" : "Zlib");
2692  }
2693 
2694  if (INFILE(_LT_INFO_ZIP) || URL_INFILE(_URL_INFO_ZIP)) {
2695  INTERESTING("Info-ZIP");
2696  }
2698  /*
2699  * IETF (primarily docs, RFCs, and protocol/standard proposals) . This
2700  * one is a little strange as text-formatters that print this license
2701  * will occasionally split the text across a page boundary. Here we
2702  * look for 2 separate footprints.
2703  */
2704  if (INFILE(_LT_IETF_1) || INFILE(_LT_IETF_2) || INFILE(_LT_IETF_3) ||
2705  INFILE(_LT_IETF_4)) {
2706  if (mCR_IETF()) {
2707  INTERESTING("IETF");
2708  }
2709  else if (INFILE(_LT_IETF_5)) {
2710  INTERESTING("IETF");
2711  }
2712  else if (HASTEXT(_LT_IETF_7, 0)) {
2713  INTERESTING("IETF");
2714  }
2715  else if (INFILE(_CR_OASIS)) {
2716  INTERESTING("OASIS");
2717  }
2718  else {
2719  INTERESTING("IETF-style");
2720  }
2721  }
2722  /*
2723  * IETF Trust's Legal Provisions
2724  */
2725  else if (INFILE(_LT_IETF_6)) {
2726  INTERESTING("IETF");
2727  }
2728  /*
2729  * Contributions to IETF Standard Process
2730  */
2731  else if (INFILE(_LT_IETF_7)) {
2732  INTERESTING("IETF-contribution");
2733  }
2735  /*
2736  * CDDL
2737  */
2738  if (INFILE(_PHR_CDDL_1) || HASTEXT(_PHR_CDDL_2, REG_EXTENDED)) {
2739  cp = CDDLVERS();
2740  INTERESTING(cp);
2741  lmem[_mCDDL] = 1;
2742  }
2744  /*
2745  * MPL (Mozilla)
2746  * ... Sun SISSL and one Mozilla licensing derivative share wording
2747  */
2748  if (!lmem[_fREAL] && NOT_INFILE(_LT_CPALref) && NOT_INFILE(_TITLE_GSOAP) &&
2749  (INFILE(_LT_MPL_OR) || INFILE(_TITLE_MPL_ref))) {
2750  cp = MPLVERS(); /* NPL, too */
2751  INTERESTING(lDebug ? "MPL/NPL#2" : cp);
2752  lmem[_mMPL] = 1;
2753  }
2754  if (INFILE(_LT_CPALref)) {
2755  if (INFILE(_TITLE_CPAL10)) {
2756  INTERESTING(lDebug ? "CPAL_v1.0(#2)" : "CPAL-1.0");
2757  lmem[_mMPL] = 1;
2758  lmem[_fATTRIB] = 1;
2759  }
2760  else if (INFILE(_TITLE_CPAL)) {
2761  INTERESTING(lDebug ? "CPAL(#2)" : "CPAL");
2762  lmem[_mMPL] = 1;
2763  lmem[_fATTRIB] = 1;
2764  }
2765  }
2766  else if (INFILE(_LT_CPAL_V1_ref)) {
2767  INTERESTING(lDebug ? "CPAL_v1.0(#3)" : "CPAL-1.0");
2768  lmem[_mMPL] = 1;
2769  lmem[_fATTRIB] = 1;
2770  }
2771  if (!lmem[_mMPL] && INFILE(_LT_MPL_2)) {
2772  if (INFILE(_TITLE_SISSL)) {
2773  cp = SISSLVERS();
2774  INTERESTING(lDebug ? "SISSL(MPL)" : cp);
2775  lmem[_mSUN] = 1;
2776  }
2777  else if (INFILE(_TITLE_SUN_PL10)) {
2778  INTERESTING("SPL-1.0");
2779  lmem[_mSUN] = 1;
2780  }
2781  else if (INFILE(_TITLE_SUN_PL)) {
2782  INTERESTING("SPL");
2783  lmem[_mSUN] = 1;
2784  }
2785  else if (INFILE(_TITLE_IDPL_V10)) {
2786  INTERESTING("IDPL-1.0");
2787  lmem[_mMPL] = 1;
2788  }
2789  else if (INFILE(_TITLE_IDPL)) {
2790  INTERESTING("IDPL");
2791  lmem[_mMPL] = 1;
2792  }
2793  else if (INFILE(_TITLE_INTERBASE)) {
2794  INTERESTING("Interbase-1.0");
2795  lmem[_mMPL] = 1;
2796  }
2797  else if (INFILE(_TITLE_NETIZEN_V10)) {
2798  INTERESTING("NOSL-1.0");
2799  lmem[_mMPL] = 1;
2800  }
2801  else if (INFILE(_TITLE_NETIZEN)) {
2802  INTERESTING(lDebug ? "NOSL(#1)" : "NOSL");
2803  lmem[_mMPL] = 1;
2804  }
2805  else if (INFILE(_TITLE_TPL10)) {
2806  INTERESTING(lDebug ? "TPL(v1.0#1)" : "MPL.TPL-1.0");
2807  lmem[_mMPL] = 1;
2808  }
2809  else if (INFILE(_TITLE_TPL)) {
2810  INTERESTING(lDebug ? "TPL(#1)" : "MPL.TPL");
2811  lmem[_mMPL] = 1;
2812  }
2813  else if (INFILE(_TITLE_GSOAP_V13)) {
2814  INTERESTING("gSOAP-1.3b");
2815  lmem[_mGSOAP] = 1;
2816  }
2817  else if (INFILE(_TITLE_GSOAP)) {
2818  INTERESTING("gSOAP");
2819  lmem[_mGSOAP] = 1;
2820  }
2821  else if (INFILE(_TITLE_FLASH2XML10)) {
2822  INTERESTING("Flash2xml-1.0");
2823  }
2824  else if (INFILE(_TITLE_NOKIA10A)) {
2825  INTERESTING("Nokia");
2826  lmem[_mMPL] = 1;
2827  }
2828  else if (INFILE(_LT_NOKIA)) {
2829  INTERESTING("Nokia");
2830  lmem[_mMPL] = 1;
2831  }
2832  else if (INFILE(_TITLE_OPENPL10)) {
2833  INTERESTING("OPL-1.0");
2834  }
2835  else if (INFILE(_TITLE_SNIA_V11)) {
2836  INTERESTING("SNIA-1.1");
2837  }
2838  else if (INFILE(_TITLE_SNIA_V10)) {
2839  INTERESTING("SNIA-1.0");
2840  }
2841  else if (INFILE(_TITLE_CPAL10)) {
2842  INTERESTING(lDebug ? "CPAL_v1.0(#1)" : "CPAL-1.0");
2843  lmem[_mMPL] = 1;
2844  lmem[_fATTRIB] = 1;
2845  }
2846  else if (INFILE(_TITLE_CPAL)) {
2847  INTERESTING(lDebug ? "CPAL(#1)" : "CPAL");
2848  lmem[_mMPL] = 1;
2849  lmem[_fATTRIB] = 1;
2850  }
2851  else if (HASTEXT(_TEXT_MOZNET, REG_EXTENDED)) {
2852  if (INFILE(_TITLE_SUGARCRM_PL)) {
2853  INTERESTING("SugarCRM-1.1.3");
2854  lmem[_mMPL] = 1;
2855  lmem[_fATTRIB] = 1;
2856  }
2857  else if (!lmem[_mMPL] && !lmem[_fREAL] && INFILE(_TITLE_MOZNET_PL)) {
2858  cp = MPLVERS(); /* NPL, too */
2859  INTERESTING(lDebug ? "MPL/NPL#1" : cp);
2860  lmem[_mMPL] = 1;
2861  }
2862  }
2863  else if (INFILE(_TITLE_RHeCos_V11)) {
2864  INTERESTING("RHeCos-1.1");
2865  }
2866  else if (INFILE(_TITLE_CYGNUS_ECOS_V10)) {
2867  INTERESTING("Cygnus-eCos-1.0");
2868  }
2869  else if (INFILE(_TITLE_H2_V10)) {
2870  INTERESTING("H2-1.0");
2871  }
2872  else {
2873  if (!lmem[_mCDDL]) {
2874  INTERESTING("MPL-style");
2875  lmem[_mMPL] = 1;
2876  }
2877  }
2878  }
2879  else if (!lmem[_mMPL] && (INFILE(_LT_NPLref) || INFILE(_LT_NPL_1))) {
2880  cp = MPLVERS(); /* NPL, too */
2881  INTERESTING(lDebug ? "MPL/NPL#3" : cp);
2882  lmem[_mMPL] = 1;
2883  }
2884  else if (!lmem[_mMPL] && INFILE(_LT_MPLref1)) {
2885  cp = MPLVERS(); /* NPL, too */
2886  INTERESTING(lDebug ? "MPL/NPL-ref#1" : cp);
2887  lmem[_mMPL] = 1;
2888  }
2889  else if (!lmem[_mMPL] && INFILE(_LT_IDPLref)) {
2890  if (INFILE(_TITLE_IDPL_V10)) {
2891  INTERESTING(lDebug ? "IDPL-v1(ref)" : "IDPL-1.0");
2892  }
2893  else {
2894  INTERESTING(lDebug ? "IDPL(ref)" : "IDPL");
2895  }
2896  lmem[_mMPL] = 1;
2897  }
2898  else if (!lmem[_mMPL] && !lmem[_mLIBRE] && !lmem[_fREAL] &&
2899  !LVAL(_TEXT_GNU_LIC_INFO) && INFILE(_LT_MPLref2)) {
2900  cp = MPLVERS(); /* NPL, too */
2901  INTERESTING(lDebug ? "MPL/NPL-ref#2" : cp);
2902  lmem[_mMPL] = 1;
2903  }
2904  else if (!lmem[_mMPL] && !lmem[_mLIBRE] && !lmem[_fREAL] &&
2905  !LVAL(_TEXT_GNU_LIC_INFO) && INFILE(_TITLE_MOZNET_PL)) {
2906  cp = MPLVERS(); /* NPL, too */
2907  INTERESTING(lDebug ? "MPL/NPL#4" : cp);
2908  lmem[_mMPL] = 1;
2909  }
2910  else if (!lmem[_mMPL] && INFILE(_TITLE_NETSCAPE_EULA)) {
2911  INTERESTING("NPL-EULA");
2912  lmem[_mMPL] = 0;
2913  }
2914  else if (INFILE(_LT_NPL_2)) {
2915  INTERESTING(lDebug ? "NPL(#1)" : "NPL");
2916  lmem[_mMPL] = 0;
2917  }
2918  else if (INFILE(_TITLE_OPENPL)) {
2919  INTERESTING(lDebug ? "OPL(title)" : "OPL-style");
2920  }
2922  /*
2923  * Microsoft licenses: open and proprietary/EULA
2924  */
2925  if (INFILE(_LT_MSCORP_SSLref)) {
2926  INTERESTING(lDebug ? "MS-SSL(ref)" : "MS-SSL");
2927  lmem[_fMSCORP] = 1;
2928  }
2929  if (INFILE(_LT_MSCORP_PL)) {
2930  int ms_l = INFILE(_LT_MSCORP_LIMITED);
2931  int ms_r = INFILE(_LT_MSCORP_RL);
2932  if (ms_r && ms_l) {
2933  INTERESTING("MS-LRL");
2934  }
2935  else if (ms_r) {
2936  INTERESTING(lDebug ? "MS-RL(#1)" : "MS-RL");
2937  }
2938  else if (ms_l) {
2939  INTERESTING("MS-LPL");
2940  }
2941  else {
2942  INTERESTING(lDebug ? "MS-PL(#1)" : "MS-PL");
2943  }
2944  }
2945  else if (INFILE(_LT_MSCORP_LIMITEDref1)) {
2946  INTERESTING("MS-LPL");
2947  lmem[_fMSCORP] = 1;
2948  }
2949 
2950  if (INFILE(_TEXT_MICROSOFT)) {
2951  if (INFILE(_LT_MSCORP_INDEMNIFY)) {
2952  INTERESTING("MS-indemnity");
2953  lmem[_fMSCORP] = 1;
2954  }
2955  else if (INFILE(_LT_MSCORP_IP_1)) {
2956  INTERESTING(lDebug ? "MS-IP(1)" : "MS-IP");
2957  lmem[_fMSCORP] = 1;
2958  }
2959  else if (INFILE(_LT_MSCORP_IP_2)) {
2960  INTERESTING(lDebug ? "MS-IP(2)" : "MS-IP");
2961  lmem[_fMSCORP] = 1;
2962  }
2963  else if (INFILE(_LT_MSCORP_PLref1)) {
2964  INTERESTING(lDebug ? "MS-PL(ref1)" : "MS-PL");
2965  lmem[_fMSCORP] = 1;
2966  }
2967  else if (INFILE(_LT_MSCORP_PLref2)) {
2968  INTERESTING(lDebug ? "MS-PL(ref2)" : "MS-PL");
2969  lmem[_fMSCORP] = 1;
2970  }
2971  else if (INFILE(_LT_MSCORP_PLref3)) {
2972  INTERESTING(lDebug ? "MS-PL(ref3)" : "MS-PL");
2973  lmem[_fMSCORP] = 1;
2974  }
2975  else if (INFILE(_LT_MSCORP_RLref)) {
2976  INTERESTING(lDebug ? "MS-RL(ref)" : "MS-RL");
2977  lmem[_fMSCORP] = 1;
2978  }
2979  else if (INFILE(_LT_MSCORP_REFLIC)) {
2980  INTERESTING("MRL");
2981  lmem[_fMSCORP] = 1;
2982  }
2983  else if (INFILE(_LT_MSCORP_EULA_1) ||
2984  INFILE(_TITLE_MSCORP_EULA)) {
2985  INTERESTING(lDebug ? "MS-EULA(1)" : "MS-EULA");
2986  lmem[_fMSCORP] = 1;
2987  }
2988  else if (INFILE(_LT_MSCORP_EULA_2)) {
2989  INTERESTING(lDebug ? "MS-EULA(2)" : "MS-EULA");
2990  lmem[_fMSCORP] = 1;
2991  }
2992  else if (INFILE(_LT_MSCORP_EULA_3)) {
2993  INTERESTING(lDebug ? "MS-EULA(3)" : "MS-EULA");
2994  lmem[_fMSCORP] = 1;
2995  }
2996  else if (INFILE(_LT_MSCORP_EULA_4)) {
2997  INTERESTING(lDebug ? "MS-EULA(4)" : "MS-EULA");
2998  lmem[_fMSCORP] = 1;
2999  }
3000  else if (INFILE(_LT_MSCORP_EULA_5)) {
3001  INTERESTING(lDebug ? "MS-EULA(5)" : "MS-EULA");
3002  lmem[_fMSCORP] = 1;
3003  }
3004  else if (INFILE(_LT_MSCORP_EULA_6)) {
3005  INTERESTING(lDebug ? "MS-EULA(6)" : "MS-EULA");
3006  lmem[_fMSCORP] = 1;
3007  }
3008  else if (INFILE(_LT_MSCORP_1)) {
3009  INTERESTING(lDebug ? "MS(1)" : "Microsoft");
3010  lmem[_fMSCORP] = 1;
3011  }
3012  else if (INFILE(_LT_MSCORP_2)) {
3013  INTERESTING(lDebug ? "MS(2)" : "Microsoft");
3014  lmem[_fMSCORP] = 1;
3015  }
3016  else if (INFILE(_LT_MSCORP_3)) {
3017  INTERESTING(lDebug ? "MS(3)" : "Microsoft");
3018  lmem[_fMSCORP] = 1;
3019  }
3020  else if (INFILE(_LT_MSCORP_4)) {
3021  INTERESTING(lDebug ? "MS(4)" : "Microsoft");
3022  lmem[_fMSCORP] = 1;
3023  }
3024  else if (INFILE(_LT_MSCORP_5)) {
3025  INTERESTING(lDebug ? "MS(5)" : "Microsoft");
3026  lmem[_fMSCORP] = 1;
3027  }
3028  else if (INFILE(_LT_MSCORPref1)) {
3029  INTERESTING("Microsoft");
3030  lmem[_fMSCORP] = 1;
3031  }
3032  }
3034  /*
3035  * Santa Cruz Operation (SCO)
3036  */
3037  if (INFILE(_LT_SCO_COMM) && INFILE(_CR_SCO)) {
3038  INTERESTING("SCO.commercial");
3039  }
3041  /*
3042  * Zonealarm
3043  */
3044  if (INFILE(_LT_ZONEALARM) && INFILE(_TITLE_ZONEALARM_EULA)) {
3045  INTERESTING("ZoneAlarm-EULA");
3046  }
3048  /*
3049  * Ximian
3050  */
3051  if (HASTEXT(_TEXT_XIMIAN, 0)) {
3052  if (INFILE(_CR_XIMIAN)) {
3053  if (INFILE(_LT_XIMIAN)) {
3054  if (INFILE(_TITLE_XIMIANLOGO10)) {
3055  INTERESTING("Ximian-1.0");
3056  }
3057  else if (INFILE(_TITLE_XIMIANLOGO)) {
3058  INTERESTING("Ximian");
3059  }
3060  }
3061  }
3062  }
3064  /*
3065  * Xerox
3066  */
3067  if (HASTEXT(_TEXT_XEROX, 0)) {
3068  if (INFILE(_LT_XEROX_1) || INFILE(_LT_XEROX_2)) {
3069  if (INFILE(_CR_XEROX_1) || INFILE(_CR_XEROX_2)) {
3070  INTERESTING("Xerox");
3071  }
3072  else {
3073  INTERESTING("Xerox-style");
3074  }
3075  }
3076  }
3078  /*
3079  * Artifex Software
3080  */
3081  if (INFILE(_LT_ARTIFEX) && INFILE(_CR_ARTIFEX)) {
3082  INTERESTING("Artifex");
3083  }
3085  /*
3086  * AGE logic
3087  */
3088  if (INFILE(_LT_AGE) && INFILE(_CR_AGE)) {
3089  INTERESTING("AGE-Logic");
3090  }
3092  /*
3093  * OpenSSL
3094  */
3095  if (INFILE(_LT_OPENSSLref1) || INFILE(_LT_OPENSSLref2) ||
3096  INFILE(_LT_OPENSSLref3) || INFILE(_LT_OPENSSLref4) ||
3097  INFILE(_LT_OPENSSLref6) || INFILE(_LT_OPENSSLref7) ||
3098  INFILE(_LT_OPENSSLref8) ) {
3099  INTERESTING(lDebug ? "OpenSSL(ref)" : "OpenSSL");
3100  }
3101  else if (INFILE(_SPDX_OpenSSL) || INFILE(_URL_OPENSSL)) {
3102  INTERESTING(lDebug ? "OpenSSL(phr)" : "OpenSSL");
3103  }
3105  /*
3106  * Dual OpenSSL SSLeay
3107  */
3108  if (INFILE(_LT_COMBINED_OPENSSL_SSLEAY)) {
3109  INTERESTING("OpenSSL");
3110  INTERESTING("SSLeay");
3111  }
3113  /*
3114  * Ruby. Ruby is a dual license which allows distribution also under GPL.
3115  * GPL was earlier recognized beside Ruby here but GPL was not identified
3116  * in all Ruby cases. Therefore GPL statements have bee removed.
3117  */
3118  if (INFILE(_LT_RUBY)) {
3119  INTERESTING("Ruby");
3120  lmem[_fRUBY] = 1;
3121  }
3122  else if (INFILE(_LT_RUBYref1)) {
3123  INTERESTING(lDebug ? "Ruby(ref1)" : "Ruby");
3124  }
3125  else if (INFILE(_LT_RUBYref2)) {
3126  INTERESTING(lDebug ? "Ruby(ref2)" : "Ruby");
3127  }
3128  else if (INFILE(_LT_RUBYref3)) {
3129  INTERESTING(lDebug ? "Ruby(ref3)" : "Ruby");
3130  }
3131  else if (INFILE(_LT_RUBYref4)) {
3132  INTERESTING(lDebug ? "Ruby(ref4)" : "Ruby");
3133  }
3134  else if (INFILE(_LT_RUBYref5)) {
3135  INTERESTING(lDebug ? "Ruby(ref5)" : "Ruby");
3136  }
3137  else if (INFILE(_LT_RUBYref6)) {
3138  INTERESTING(lDebug ? "Ruby(ref6)" : "Ruby");
3139  }
3141  /*
3142  * Python and EGenix.com look a bit alike
3143  * Q: should all these Python rhecks be a family-check like OpenLDAP?
3144  */
3145  if (INFILE(_LT_EGENIX_COM)) {
3146  INTERESTING("eGenix");
3147  }
3148  else if (INFILE(_LT_PYTHON_4)) {
3149  INTERESTING("Python");
3150  lmem[_mPYTHON] = 1;
3151  }
3152  else if (!lmem[_mPYTHON] && lmem[_mPYTH_TEXT]) {
3153  if (INFILE(_LT_PYTHON_1) || INFILE(_LT_PYTHON_2)) {
3154  if (INFILE(_LT_CNRI_PYTHON_GPL)) {
3155  INTERESTING("CNRI-Python-GPL-Compatible");
3156  lmem[_mGPL] = 1;
3157  }
3158  else if (INFILE(_CR_PYTHON) || INFILE(_TITLE_PYTHON)) {
3159  cp = PYTHVERS();
3160  INTERESTING(lDebug ? "Python(1)" : cp);
3161  }
3162  else if (INFILE(_LT_CNRI_PYTHON_1)) {
3163  INTERESTING("CNRI-Python");
3164  }
3165  else if (INFILE(_LT_CNRI_JYTHON)) {
3166  INTERESTING("CNRI-Jython");
3167  }
3168  else {
3169  INTERESTING("Python-style");
3170  }
3171  lmem[_mPYTHON] = 1;
3172  }
3173  else if (INFILE(_SPDX_CNRI_Python_GPL_Compatible)) {
3174  INTERESTING("CNRI-Python-GPL-Compatible");
3175  }
3176  else if (INFILE(_SPDX_CNRI_Python)) {
3177  INTERESTING("CNRI-Python");
3178  }
3179  else if (INFILE(_LT_CNRI_PYTHON_2)) {
3180  INTERESTING("CNRI-Python");
3181  }
3182  else if (INFILE(_LT_PYTHON_3)) {
3183  cp = PYTHVERS();
3184  INTERESTING(lDebug ? "Python(4)" : cp);
3185  lmem[_mPYTHON] = 1;
3186  }
3187  else if (INFILE(_LT_PYTHONSTYLEref)) {
3188  cp = PYTHVERS();
3189  INTERESTING(lDebug ? "Python(ref1)" : "Python-style");
3190  lmem[_mPYTHON] = 1;
3191  }
3192  else if (!lmem[_mLIBRE] && (INFILE(_LT_PYTHONref1) ||
3193  INFILE(_LT_PYTHONref2))) {
3194  cp = PYTHVERS();
3195  INTERESTING(lDebug ? "Python(ref2)" : cp);
3196  lmem[_mPYTHON] = 1;
3197  }
3198  else if (!lmem[_mLIBRE] && !lmem[_fREAL] &&
3199  !LVAL(_TEXT_GNU_LIC_INFO) && INFILE(_LT_PYTHONref3)) {
3200  cp = PYTHVERS();
3201  INTERESTING(lDebug ? "Python(ref3)" : cp);
3202  lmem[_mPYTHON] = 1;
3203  }
3204  else if (!lmem[_mPYTHON] && URL_INFILE(_URL_PYTHON)) {
3205  cp = PYTHVERS();
3206  INTERESTING(lDebug ? "Python(url)" : cp);
3207  lmem[_mPYTHON] = 1;
3208  }
3209  else if (!lmem[_mPYTHON] && INFILE(_LT_PYTHON22ref)) {
3210  INTERESTING(lDebug ? "Python(22ref)" : "Python-2.2");
3211  lmem[_mPYTHON] = 1;
3212  }
3213  }
3215  /*
3216  * Intel
3217  */
3218  if (INFILE(_LT_INTEL) && NOT_INFILE(_LT_REAL_RPSL)) {
3219  INTERESTING(lDebug ? "Intel(8)" : "Intel");
3220  }
3221  else if (INFILE(_LT_INTEL_6)) {
3222  INTERESTING(lDebug ? "Intel(9)" : "Intel-other");
3223  }
3224  else if (INFILE(_LT_INTEL_7)) {
3225  INTERESTING(lDebug ? "Intel(10)" : "Intel-other");
3226  }
3227  else if (INFILE(_LT_INTEL_WLAN)) {
3228  INTERESTING("Intel-WLAN");
3229  }
3230  else if (INFILE(_LT_INTEL_ACPI)) {
3231  INTERESTING("Intel-ACPI");
3232  }
3233  else if (INFILE(_SPDX_Intel_ACPI)) {
3234  INTERESTING("Intel-ACPI");
3235  }
3236  else if (INFILE(_LT_ISSL_1) && INFILE(_LT_ISSL_2)) {
3237  INTERESTING("ISSL");
3238  }
3239  else if (!lmem[_fREAL] && INFILE(_SPDX_Intel)) {
3240  INTERESTING("Intel");
3241  }
3242  else if (HASTEXT(_TEXT_INTELCORP, 0)) {
3243  if (INFILE(_LT_INTEL_1)) {
3244  if (INFILE(_LT_INTEL_FW)) {
3245  INTERESTING(lDebug ? "Intel(2)" : "Intel-only-FW");
3246  }
3247  else {
3248  INTERESTING(lDebug ? "Intel(3)" : "Intel");
3249  }
3250  }
3251  else if (INFILE(_LT_INTEL_2)) {
3252  INTERESTING(lDebug ? "Intel(4)" : "Intel");
3253  }
3254  else if (INFILE(_LT_INTEL_3)) {
3255  INTERESTING(lDebug ? "Intel(5)" : "Intel");
3256  }
3257  else if (INFILE(_LT_INTEL_4)) {
3258  INTERESTING(lDebug ? "Intel(6)" : "Intel");
3259  }
3260  else if (INFILE(_LT_INTEL_RESTRICT)) {
3261  INTERESTING("Intel.RESTRICTED");
3262  }
3263  else if (INFILE(_LT_INTEL_BINARY) && HASTEXT(_TEXT_INTELCORPBINARY, 0) && HASTEXT(_TEXT_NOMODIFICATION, 0)) {
3264  INTERESTING("Intel-Binary");
3265  }
3266  }
3267  else if (INFILE(_LT_INTEL_5)) {
3268  INTERESTING(lDebug ? "CPL(Intel)" : "CPL");
3269  INTERESTING(lDebug ? "Intel(7)" : "Intel");
3270  }
3271  else if (INFILE(_LT_INTEL_EULA)) {
3272  INTERESTING("Intel-EULA");
3273  }
3275  /*
3276  * Bellcore
3277  */
3278  if (INFILE(_LT_BELLCORE)) {
3279  if (INFILE(_CR_BELLCORE)) {
3280  INTERESTING("Bellcore");
3281  }
3282  else {
3283  INTERESTING("Bellcore-style");
3284  }
3285  }
3287  /*
3288  * Purdue
3289  */
3290  if (INFILE(_LT_PURDUE) && INFILE(_CR_PURDUE) && HASTEXT(_TEXT_ALTERED_SOURCE, REG_EXTENDED) && HASTEXT(_TEXT_ORIGIN, 0)) {
3291  INTERESTING("Purdue");
3292  /* flag is set to avoid Cisco-style detection */
3293  lmem[_fPURDUE] = 1;
3294  }
3296  /*
3297  * Cisco systems
3298  */
3299  if (!lmem[_fPURDUE] && INFILE(_LT_CISCO)) {
3300  if (HASTEXT(_LT_PNG_ZLIB_CLAUSE_1, 0) &&
3301  HASTEXT(_LT_PNG_ZLIB_CLAUSE_2, REG_EXTENDED) &&
3302  HASTEXT(_LT_PNG_ZLIB_CLAUSE_3, 0)) {
3303  if (INFILE(_LT_Spencer_86_94_CLAUSE_1) && INFILE(_LT_Spencer_94_CLAUSE_2)) {
3304  INTERESTING("Spencer-94");
3305  }
3306  else {
3307  INTERESTING("Zlib-style");
3308  }
3309  }
3310  else if (INFILE(_CR_CISCO)) {
3311  INTERESTING("Cisco");
3312  }
3313  else {
3314  INTERESTING("Cisco-style");
3315  }
3316  }
3318  /*
3319  * HP
3320  */
3321  if (INFILE(_LT_HP_DEC)) {
3322  if (mCR_HP()) {
3323  INTERESTING(lDebug ? "HP(8)" : "HP");
3324  }
3325  else if (INFILE(_CR_ADOBE)) {
3326  INTERESTING(lDebug ? "Adobe(8)" : "Adobe");
3327  }
3328  else if (INFILE(_LT_GNUPLOT_1) && INFILE(_LT_GNUPLOT_2)) {
3329  INTERESTING("gnuplot");
3330  }
3331  else {
3332  INTERESTING(lDebug ? "HP-DEC-style(1)" : "HP-DEC-style");
3333  }
3334  }
3335  else if (HASTEXT(_TEXT_HP, REG_EXTENDED)) {
3336  if (INFILE(_LT_HP_1)) {
3337  INTERESTING(lDebug ? "HP(2)" : "HP");
3338  }
3339  else if (INFILE(_LT_HP_3) && INFILE(_LT_HP_snmp_pp)) {
3340  INTERESTING(lDebug ? "HP(3)" : "hp-snmp-pp");
3341  }
3342  else if (INFILE(_LT_HP_4)) {
3343  INTERESTING(lDebug ? "HP(4)" : "HP");
3344  }
3345  else if (INFILE(_LT_HP_5)) {
3346  INTERESTING(lDebug ? "HP(5)" : "HP");
3347  }
3348  else if (INFILE(_LT_HP_6)) {
3349  INTERESTING(lDebug ? "HP(6)" : "HP");
3350  }
3351  else if (INFILE(_LT_HP_7)) {
3352  INTERESTING(lDebug ? "HP(7)" : "HP");
3353  }
3354  else if (INFILE(_LT_COMPAQ_1)) {
3355  INTERESTING(lDebug ? "Compaq(1)" : "HP-Compaq");
3356  }
3357  else if (INFILE(_LT_HP_EULA1)) {
3358  INTERESTING(lDebug ? "HP-EULA(1)" : "HP-EULA");
3359  }
3360  else if (INFILE(_LT_HP_EULA2)) {
3361  INTERESTING(lDebug ? "HP-EULA(2)" : "HP-EULA");
3362  }
3363  else if (INFILE(_LT_HP_EULA3)) {
3364  INTERESTING(lDebug ? "HP-EULA(3)" : "HP-EULA");
3365  }
3366  else if (INFILE(_LT_HP_EULA4)) {
3367  INTERESTING(lDebug ? "HP-EULA(4)" : "HP-EULA");
3368  }
3369  else if (INFILE(_LT_COMPAQ_EULA)) {
3370  INTERESTING(lDebug ? "Compaq(EULA)" : "HP-Compaq");
3371  }
3372  else if (INFILE(_LT_HP_PROPRIETARY_1)) {
3373  INTERESTING(lDebug ? "HP-prop(1)" : "HP-Proprietary");
3374  }
3375  else if (INFILE(_LT_HP_PROPRIETARY_2)) {
3376  INTERESTING(lDebug ? "HP-prop(2)" : "HP-Proprietary");
3377  }
3378  else if (INFILE(_LT_HP_PROPRIETARY_3)) {
3379  INTERESTING(lDebug ? "HP-prop(3)" : "HP-Proprietary");
3380  }
3381  else if (INFILE(_LT_HP_IBM_1)) {
3382  INTERESTING(lDebug ? "HP+IBM(1)" : "HP+IBM");
3383  }
3384  else if (INFILE(_LT_HP_IBM_2)) {
3385  INTERESTING(lDebug ? "HP+IBM(2)" : "HP+IBM");
3386  }
3387  else if (!lmem[_mHP] && INFILE(_CR_DEC) && INFILE(_LT_DEC_1)) {
3388  INTERESTING(lDebug ? "HP-DEC(3)" : "HP-DEC");
3389  lmem[_mHP] = 1;
3390  }
3391  else if (!lmem[_mHP] && INFILE(_CR_DEC) && INFILE(_LT_DEC_2)) {
3392  INTERESTING(lDebug ? "HP-DEC(4)" : "HP-DEC");
3393  lmem[_mHP] = 1;
3394  }
3395  else if (INFILE(_LT_EDS_1) && INFILE(_CR_EDS)) {
3396  INTERESTING(lDebug ? "HP-EDS(1)" : "HP");
3397  }
3398  else if (INFILE(_LT_EDS_2) && INFILE(_CR_EDS)) {
3399  INTERESTING(lDebug ? "HP-EDS(2)" : "HP");
3400  }
3401  }
3402  else if (!lmem[_mHP] && INFILE(_LT_DEC_1)) {
3403  INTERESTING(lDebug ? "HP-DEC-style(2)" : "HP-DEC-style");
3404  }
3405  else if (!lmem[_mHP] && INFILE(_LT_DEC_2)) {
3406  INTERESTING(lDebug ? "HP-DEC-style(3)" : "HP-DEC-style");
3407  }
3408  else if (INFILE(_LT_HP_4)) {
3409  INTERESTING(lDebug ? "HP-style(1)" : "HP-style");
3410  }
3411  else if (INFILE(_LT_COMPAQ_1)) {
3412  INTERESTING(lDebug ? "HP-style(2)" : "HP-style");
3413  }
3414  else if (INFILE(_LT_EDS_1)) {
3415  INTERESTING(lDebug ? "HP-EDS(1#2)" : "HP");
3416  }
3417  else if (INFILE(_LT_EDS_2)) {
3418  INTERESTING(lDebug ? "HP-EDS(2#2)" : "HP");
3419  }
3421  /*
3422  * SUN Microsystems
3423  */
3424  if (!lmem[_mSUN] && (INFILE(_CR_SUN) || INFILE(_TEXT_MICROSYSTEMS))) {
3425  if (INFILE(_LT_SUN_PROPRIETARY) || INFILE(_LT_SUN_PROPRIETARY_2) || INFILE(_LT_SUN_PROPRIETARY_3)) {
3426  INTERESTING(lDebug ? "Sun(Prop)" : "Sun-Proprietary");
3427  lmem[_mSUN] = 1;
3428  }
3429  else if (INFILE(_LT_SUN_RPC)) {
3430  INTERESTING("Sun-RPC");
3431  lmem[_mSUN] = 1;
3432  }
3433  else if (INFILE(_LT_SUN_1)) {
3434  if (INFILE(_LT_SUN_FREE)) {
3435  INTERESTING(lDebug ? "Sun(Freeware)" : "Freeware");
3436  }
3437  else {
3438  INTERESTING(lDebug ? "Sun(3)" : "Sun");
3439  }
3440  lmem[_mSUN] = 1;
3441  }
3442  else if (INFILE(_LT_SUN_2)) {
3443  INTERESTING(lDebug ? "Sun(4)" : "Sun-Proprietary");
3444  lmem[_mSUN] = 1;
3445  }
3446  else if (INFILE(_LT_SUN_3)) {
3447  INTERESTING(lDebug ? "Sun(5)" : "Sun");
3448  lmem[_mSUN] = 1;
3449  }
3450  else if (INFILE(_LT_SUN_4)) {
3451  INTERESTING(lDebug ? "Sun(6)" : "Sun");
3452  lmem[_mSUN] = 1;
3453  }
3454  else if (INFILE(_LT_SUN_5)) {
3455  INTERESTING(lDebug ? "Sun(7)" : "Freeware");
3456  lmem[_mSUN] = 1;
3457  }
3458  else if (INFILE(_LT_SUN_6)) {
3459  INTERESTING(lDebug ? "Sun(8)" : "BSD-style");
3460  lmem[_mSUN] = 1;
3461  }
3462  else if (INFILE(_LT_SUN_NC)) {
3463  INTERESTING("Sun.Non-commercial");
3464  lmem[_mSUN] = 1;
3465  }
3466  else if (INFILE(_LT_SUNrestrict)) {
3467  INTERESTING("Sun.RESTRICTED");
3468  lmem[_mSUN] = 1;
3469  }
3470  else if (INFILE(_LT_SUN_BCLA_1) && INFILE(_TITLE_SUN_BCLA)) {
3471  INTERESTING(lDebug ? "BCLA(1)" : "Sun-BCLA");
3472  lmem[_mSUN] = 1;
3473  }
3474  else if (INFILE(_LT_SUN_BCLA_2)) {
3475  INTERESTING(lDebug ? "BCLA(2)" : "Sun-BCLA");
3476  lmem[_mSUN] = 1;
3477  }
3478  else if (INFILE(_LT_SUN_BCLAref)) {
3479  INTERESTING(lDebug ? "BCLA(ref)" : "Sun-BCLA");
3480  lmem[_mSUN] = 1;
3481  }
3482  else if (INFILE(_LT_SUN_ENTITLE)) {
3483  INTERESTING(lDebug ? "Sun(entitlement)" : "Sun");
3484  lmem[_mSUN] = 1;
3485  }
3486  else if (INFILE(_LT_SUN_ANYagreement)) {
3487  INTERESTING("Sun-EULA");
3488  lmem[_mSUN] = 1;
3489  }
3490  else if (INFILE(_LT_SUN_JAVA)) {
3491  INTERESTING("Sun-Java");
3492  lmem[_mSUN] = 1;
3493  }
3494  else if (INFILE(_LT_SUN_IP)) {
3495  INTERESTING("Sun-IP");
3496  lmem[_mSUN] = 1;
3497  lmem[_fIP] = 1;
3498  }
3499  else if (INFILE(_LT_SUN_SCA)) {
3500  INTERESTING("Sun-SCA");
3501  lmem[_mSUN] = 1;
3502  }
3503  else if (INFILE(_LT_SUN_SCSLref)) {
3504  if (INFILE(_TITLE_SCSL_V23)) {
3505  INTERESTING("SCSL-2.3");
3506  }
3507  else if (INFILE(_TITLE_SCSL_V30)) {
3508  INTERESTING("SCSL-3.0");
3509  }
3510  else {
3511  INTERESTING("SCSL");
3512  }
3513  lmem[_mSUN] = 1;
3514  }
3515  else if (INFILE(_TITLE_SUN_SCSL_TSA) &&
3516  INFILE(_LT_SUN_SCSL_TSA)) {
3517  if (INFILE(_TITLE_TSA_10)) {
3518  INTERESTING("SCSL-TSA-1.0");
3519  }
3520  else {
3521  INTERESTING("SCSL-TSA");
3522  }
3523  lmem[_mSUN] = 1;
3524  }
3525  else if (INFILE(_LT_SUN_SISSLref1)
3526  || INFILE(_LT_SUN_SISSLref2)) {
3527  cp = SISSLVERS();
3528  INTERESTING(lDebug ? "SISSL(ref#1)" : cp);
3529  lmem[_mSUN] = 1;
3530  }
3531  }
3532  else if (!lmem[_fREAL] && INFILE(_LT_SUN_PLref)) {
3533  INTERESTING(lDebug ? "Sun-PL(ref)" : "SPL");
3534  lmem[_mSUN] = 1;
3535  }
3536  else if (!lmem[_mSUN] && URL_INFILE(_URL_SUN_BINARY_V150)) {
3537  INTERESTING("Sun-BCLA-1.5.0");
3538  lmem[_mSUN] = 1;
3539  }
3540  else if (!lmem[_mSUN] && URL_INFILE(_URL_SUN_BINARY)) {
3541  INTERESTING(lDebug ? "BCLA(url)" : "Sun-BCLA");
3542  lmem[_mSUN] = 1;
3543  }
3544  else if (!lmem[_mSUN] && INFILE(_LT_SUN_GRAPHICS)) {
3545  INTERESTING(lDebug ? "Sun(8)" : "Sun");
3546  lmem[_mSUN] = 1;
3547  }
3548  else if (!lmem[_mSUN] && INFILE(_LT_SUN_GRAPHICS)) {
3549  INTERESTING(lDebug ? "Sun(9)" : "Sun");
3550  lmem[_mSUN] = 1;
3551  }
3552  else if ((!lmem[_mSUN] && INFILE(_LT_SUN_SISSLref1)) ||
3553  INFILE(_LT_SUN_SISSLref2)) {
3554  cp = SISSLVERS();
3555  INTERESTING(lDebug ? "SISSL(ref#2)" : cp);
3556  lmem[_mSUN] = 1;
3557  }
3558  else if (!lmem[_mSUN] && URL_INFILE(_URL_SISSL)) {
3559  cp = SISSLVERS();
3560  INTERESTING(lDebug ? "SISSL(url)" : cp);
3561  lmem[_mSUN] = 1;
3562  }
3564  if (INFILE(_LT_SUN_PRO)) {
3565  INTERESTING(lDebug ? "SunPro" : "Freeware");
3566  }
3568  /*
3569  * IBM
3570  */
3571  if (INFILE(_TEXT_IBM)) {
3572  if (INFILE(_LT_IBM_RECIP)) {
3573  INTERESTING("IBM-reciprocal");
3574  }
3575  else if (INFILE(_LT_IBM_4)) {
3576  INTERESTING(lDebug ? "IBM(4)" : "IBM-dhcp");
3577  }
3578  else if (INFILE(_LT_IBM_1)) {
3579  INTERESTING(lDebug ? "IBM(1)" : "MIT-style");
3580  }
3581  else if (INFILE(_LT_IBM_3)) {
3582  INTERESTING(lDebug ? "IBM(3)" : "MIT-style");
3583  }
3584  else if (INFILE(_LT_IBM_2)) {
3585  INTERESTING(lDebug ? "IBM(2)" : "IBM");
3586  }
3587  else if (INFILE(_LT_IBM_OWNER)) {
3588  INTERESTING(lDebug ? "IBM(4)" : "IBM");
3589  }
3590  else if (INFILE(_LT_IBM_JIKES)) {
3591  INTERESTING("IBM-JCL");
3592  }
3593  else if (INFILE(_LT_IBM_COURIER)) {
3594  INTERESTING("IBM-Courier");
3595  }
3596  else if (INFILE(_LT_IBM_EULA)) {
3597  INTERESTING(lDebug ? "IBM-EULA(1)" : "IBM-EULA");
3598  }
3599  else if (INFILE(_PHR_IBM_EULA)) {
3600  INTERESTING(lDebug ? "IBM-EULA(2)" : "IBM-EULA");
3601  }
3602  else if (INFILE(_LT_IBM_PIBS)) {
3603  INTERESTING("IBM-pibs");
3604  }
3605  else if (INFILE(_LT_IBM_AS_IS)) {
3606  INTERESTING("IBM-as-is");
3607  }
3608  }
3610  /*
3611  * Motorola
3612  */
3613  if (INFILE(_CR_MOT_1) || INFILE(_CR_MOT_2)) {
3614  if (INFILE(_LT_MOT_1)) {
3615  INTERESTING(lDebug ? "Motorola(1)" : "Motorola");
3616  }
3617  else if (INFILE(_LT_MOT_2)) {
3618  INTERESTING(lDebug ? "Motorola(2)" : "Motorola");
3619  }
3620  }
3621  if (HASTEXT(_TITLE_MOTOROLA_MOBILE, 0)) {
3622  INTERESTING("Motorola-Mobile-SLA");
3623  }
3625  /*
3626  * Java
3627  */
3628  if (INFILE(_LT_JAVA_WSDL4J)) {
3629  INTERESTING("Java-WSDL4J");
3630  }
3631  else if (INFILE(_LT_JAVA_WSDL_SCHEMA)) {
3632  INTERESTING("Java-WSDL-Schema");
3633  }
3634  else if (INFILE(_LT_JAVA_WSDL_POLICY)) {
3635  INTERESTING("Java-WSDL-Policy");
3636  }
3637  else if (INFILE(_LT_JAVA_WSDL_ENUM)) {
3638  INTERESTING("Java-WSDL-Spec");
3639  }
3640  else if (INFILE(_LT_MULTICORP_1)) {
3641  INTERESTING(lDebug ? "Java-Multi(1)" : "Java-Multi-Corp");
3642  }
3643  else if (INFILE(_LT_MULTICORP_2)) {
3644  INTERESTING(lDebug ? "Java-Multi(2)" : "Java-Multi-Corp");
3645  }
3647  /*
3648  * Mibble
3649  */
3650  if (INFILE(_LT_MIBBLE)) {
3651  if (INFILE(_TITLE_MIBBLE_28)) {
3652  INTERESTING("Mibble-2.8");
3653  }
3654  else {
3655  INTERESTING("Mibble");
3656  }
3657  }
3659  /*
3660  * Comtrol Corp
3661  */
3662  if (INFILE(_CR_COMTROL) && INFILE(_LT_COMTROL)) {
3663  INTERESTING("Comtrol");
3664  }
3666  /*
3667  * TrollTech
3668  */
3669  if (INFILE(_LT_TROLLTECH) && INFILE(_CR_TROLLTECH)) {
3670  INTERESTING("Trolltech");
3671  }
3672  else if (INFILE(_LT_QT_COMMref)) {
3673  INTERESTING("Qt.Commercial");
3674  }
3675  else if (INFILE(_LT_QT_PROPRIETARY) || INFILE(_TITLE_QT_PROPRIETARY)) {
3676  INTERESTING("Qt.Commercial");
3677  }
3679  /*
3680  * SNIA (Storage Network Industry) public license
3681  */
3682  if (!lmem[_mMPL] && !lmem[_mSUN] && INFILE(_LT_SNIA_PL)) {
3683  if (INFILE(_TITLE_SNIA_V11)) {
3684  INTERESTING("SNIA-1.1");
3685  }
3686  else if (INFILE(_TITLE_SNIA_V10)) {
3687  INTERESTING("SNIA-1.0");
3688  }
3689  else {
3690  INTERESTING("SNIA");
3691  }
3692  }
3693  else if (INFILE(_LT_SNIAref)) {
3694  if (INFILE(_TITLE_SNIA_V11)) {
3695  INTERESTING(lDebug ? "SNIA-1.1(ref)" : "SNIA-1.1");
3696  }
3697  else if (INFILE(_TITLE_SNIA_V10)) {
3698  INTERESTING(lDebug ? "SNIA-1.0(ref)" : "SNIA-1.0");
3699  }
3700  else {
3701  INTERESTING(lDebug ? "SNIA(ref)" : "SNIA");
3702  }
3703  }
3704  else if (URL_INFILE(_URL_SNIA_V11)) {
3705  INTERESTING(lDebug ? "SNIA-1.1(url)" : "SNIA-1.1");
3706  }
3707  else if (URL_INFILE(_URL_SNIA)) {
3708  INTERESTING(lDebug ? "SNIA(url)" : "SNIA");
3709  }
3711  /*
3712  * BEA
3713  */
3714  if (HASTEXT(_TEXT_BEASYS, 0)) {
3715  if (INFILE(_LT_BEA_1)) {
3716  INTERESTING(lDebug ? "BEA(1)" : "BEA");
3717  }
3718  else if (INFILE(_LT_BEA_2)) {
3719  INTERESTING(lDebug ? "BEA(2)" : "BEA");
3720  }
3721  }
3723  /*
3724  * ADOBE/FRAME
3725  */
3726  if (HASTEXT(_TEXT_ADOBE_FRAME, REG_EXTENDED)) {
3727  if (INFILE(_LT_ADOBE_1)) {
3728  INTERESTING(lDebug ? "Adobe(1)" : "Adobe");
3729  }
3730  else if (!lmem[_mMIT] && INFILE(_LT_ADOBE_2)) {
3731  INTERESTING(lDebug ? "Adobe(2)" : "Adobe");
3732  }
3733  else if (INFILE(_LT_ADOBE_3)) {
3734  INTERESTING(lDebug ? "Adobe(3)" : "Adobe");
3735  }
3736  else if (INFILE(_LT_ADOBE_4)) {
3737  INTERESTING(lDebug ? "Adobe(4)" : "Adobe-EULA");
3738  }
3739  else if (INFILE(_LT_ADOBE_5)) {
3740  INTERESTING(lDebug ? "Adobe(5)" : "Adobe-EULA");
3741  }
3742  else if (INFILE(_LT_ADOBE_6)) {
3743  INTERESTING(lDebug ? "Adobe(6)" : "Adobe-EULA");
3744  }
3745  else if (INFILE(_LT_ADOBE_7)) {
3746  INTERESTING(lDebug ? "Adobe(7)" : "Adobe-EULA");
3747  }
3748  else if (INFILE(_LT_FRAME)) {
3749  INTERESTING(lDebug ? "Adobe(Frame)" : "Adobe");
3750  }
3751  else if (INFILE(_LT_ADOBE_SRC) || INFILE(_TITLE_ADOBE_SRC)) {
3752  INTERESTING(lDebug ? "Adobe(src)" : "Adobe-2006");
3753  }
3754  else if (INFILE(_LT_ADOBE_DATA)) {
3755  INTERESTING(lDebug ? "Adobe(data)" : "Adobe");
3756  }
3757  else if (INFILE(_LT_ADOBE_EULA)) {
3758  INTERESTING("Adobe-EULA");
3759  }
3760  else if (INFILE(_LT_ADOBE_AFM)) {
3761  INTERESTING("APAFML");
3762  }
3763  else if (HASTEXT(_TITLE_ADOBE_DNG, 0)) {
3764  INTERESTING("Adobe-DNG");
3765  }
3766  else if (INFILE(_LT_ADOBE_AFMPARSE_1) && INFILE(_LT_ADOBE_AFMPARSE_2)) {
3767  INTERESTING("Afmparse");
3768  }
3769  else if (INFILE(_LT_ADOBE_OTHER)) {
3770  INTERESTING(lDebug ? "Adobe(other)" : "Adobe");
3771  }
3772  else if (INFILE(_LT_ADOBE_SUB)) {
3773  INTERESTING(lDebug ? "Adobe(sub)" : "Adobe");
3774  }
3775  }
3777  /*
3778  * Docbook and Open Source Metadata Framework
3779  */
3780  if (INFILE(_LT_DOCBOOK)) {
3781  if (HASTEXT(_TEXT_DOCBOOK, 0)) {
3782  INTERESTING("DOCBOOK");
3783  }
3784  else if (HASTEXT(_TEXT_METADATA, 0)) {
3785  INTERESTING("OMF");
3786  }
3787  else {
3788  INTERESTING("DOCBOOK-style");
3789  }
3790  }
3792  /*
3793  * MP3 decoder
3794  */
3795  if (INFILE(_LT_MPEG3)) {
3796  INTERESTING("MPEG3-decoder");
3797  }
3799  /*
3800  * Google
3801  */
3802  if (INFILE(_LT_GOOGLE_1)) {
3803  INTERESTING(lDebug ? "Google(1)" : "Google");
3804  }
3805  else if (INFILE(_LT_GOOGLE_2)) {
3806  INTERESTING(lDebug ? "Google(2)" : "Google");
3807  }
3809  /*
3810  * Mandriva
3811  */
3812  if (INFILE(_LT_MANDRIVA)) {
3813  INTERESTING("Mandriva");
3814  }
3816  /*
3817  * Irondoc
3818  */
3819  if (INFILE(_LT_IRONDOC)) {
3820  INTERESTING("IronDoc");
3821  }
3823  /*
3824  * Quarterdeck Office Systems
3825  */
3826  if (INFILE(_LT_QUARTERDECK) && INFILE(_CR_QUARTERDECK)) {
3827  INTERESTING("QuarterDeck");
3828  }
3830  /*
3831  * Electronic Book Technologies
3832  */
3833  if (INFILE(_LT_EBT)) {
3834  if(INFILE(_CR_EBT)) {
3835  INTERESTING("EBT");
3836  } else {
3837  INTERESTING("EBT-style");
3838  }
3839  }
3841  /*
3842  * SGML
3843  */
3844  if (HASTEXT(_TEXT_SGMLUG, 0) && INFILE(_LT_SGML)) {
3845  INTERESTING("SGML");
3846  }
3848  /*
3849  * LaTeX (KOMA-Script)
3850  */
3851  if (HASTEXT(_TEXT_LATEX, REG_EXTENDED)) {
3852  if (INFILE(_LT_LATEXPL_1) || INFILE(_LT_LATEXPL_2) ||
3853  INFILE(_LT_LATEXPL_3)) {
3854  cp = LPPLVERS();
3855  INTERESTING(lDebug ? "LPPL(1)" : cp);
3856  }
3857  else if (INFILE(_LT_LATEX)) {
3858  cp = LPPLVERS();
3859  INTERESTING(lDebug ? "LPPL(2)" : cp);
3860  }
3861  else if (INFILE(_LT_LATEXPLref1) || INFILE(_LT_LATEXPLref2) ||
3862  INFILE(_LT_LATEXPLref3)) {
3863  cp = LPPLVERS();
3864  INTERESTING(lDebug ? "LPPL(3)" : cp);
3865  }
3866  else if (INFILE(_LT_LATEXref1)) {
3867  cp = LPPLVERS();
3868  INTERESTING(lDebug ? "LPPL(4)" : cp);
3869  }
3870  else if (INFILE(_LT_LATEXref2)) {
3871  cp = LPPLVERS();
3872  INTERESTING(lDebug ? "LPPL(5)" : cp);
3873  }
3874  else if (INFILE(_LT_LATEXref3)) {
3875  cp = LPPLVERS();
3876  INTERESTING(lDebug ? "LPPL(6)" : cp);
3877  }
3878  else if (INFILE(_LT_LATEXref4)) {
3879  cp = LPPLVERS();
3880  INTERESTING(lDebug ? "LPPL(7)" : cp);
3881  }
3882  else if (INFILE(_LT_LATEXref5)) {
3883  cp = LPPLVERS();
3884  INTERESTING(lDebug ? "LPPL(8)" : cp);
3885  }
3886  else if (URL_INFILE(_URL_LATEX)) {
3887  cp = LPPLVERS();
3888  INTERESTING(lDebug ? "LPPL(url)" : cp);
3889  }
3890  }
3892  /*
3893  * QPL
3894  */
3895  if (INFILE(_LT_QPL) || INFILE(_LT_QPLref)) {
3896  if (INFILE(_TITLE_QPL10_1) || INFILE(_TITLE_QPL10_2)) {
3897  INTERESTING("QPL-1.0");
3898  lmem[_mQPL] = 1;
3899  }
3900  else if (INFILE(_TITLE_QPL)) {
3901  INTERESTING("QPL");
3902  lmem[_mQPL] = 1;
3903  }
3904  }
3906  /*
3907  * FREE Public License (not really open/free) and GHOSTSCRIPT
3908  */
3909  if (HASTEXT(_TEXT_GHOSTSCRIPT, 0)) {
3910  if (INFILE(_LT_GS)) {
3911  if (INFILE(_TITLE_GS11)) {
3912  INTERESTING("Ghostscript-GPL-1.1");
3913  }
3914  else {
3915  INTERESTING(lDebug ? "GS-GPL(1)" : "Ghostscript-GPL");
3916  }
3917  }
3918  else if (INFILE(_CR_ALADDIN) || INFILE(_CR_ARTOFCODE)) {
3919  if (INFILE(_LT_GS_GNU1) || INFILE(_LT_GS_GNU2)) {
3920  INTERESTING("GNU-Ghostscript");
3921  }
3922  else if (INFILE(_LT_GNU_1) && INFILE(_LT_GNU_2)) {
3923  INTERESTING(lDebug ? "GS-GPL(2)" : "Ghostscript-GPL");
3924  }
3925  else if (INFILE(_LT_FREEPL) || INFILE(_LT_FREEPLref)) {
3926  INTERESTING(lDebug ? "Aladdin(Closed-Source!)" : "Aladdin");
3927  if (INFILE(_PHR_NOT_OPEN)) {
3928  INTERESTING(lDebug ? "Aladdin(Closed-Source!)" : "Aladdin");
3929  lmem[_mALADDIN] = 1;
3930  }
3931  else {
3932  INTERESTING(lDebug ? "Aladdin-Ghostscript" : "Aladdin");
3933  }
3934  }
3935  else if (INFILE(_LT_ALADDIN_RESTRICT)) {
3936  INTERESTING(lDebug ? "Aladdin(RESTRICTED)": "Aladdin");
3937  }
3938  }
3939  else if (INFILE(_LT_AFPL)) {
3940  INTERESTING("AFPL-Ghostscript");
3941  }
3942  }
3943  else if (INFILE(_LT_FREEPLref_1)) {
3944  INTERESTING("Aladdin");
3945  }
3946  else if (INFILE(_LT_FREEPL) || INFILE(_LT_FREEPLref)) {
3947  INTERESTING("Free-PL");
3948  }
3949  /*
3950  * IPTC (International Press Telecommunications Council)
3951  */
3952  else if (INFILE(_TITLE_IPTC) || INFILE(_LT_IPTC_2)) {
3953  INTERESTING("IPTC");
3954  }
3955  else if (INFILE(_LT_IPTC_1) && mCR_IPTC()) {
3956  INTERESTING("IPTC");
3957  }
3958  /*
3959  * Macromedia
3960  */
3961  else if (INFILE(_TITLE_MACROMEDIA_EULA)) {
3962  INTERESTING("MacroMedia-RPSL");
3963  }
3964  /*
3965  * Ontopia
3966  */
3967  else if (INFILE(_LT_ONTOPIA) && INFILE(_TITLE_ONTOPIA)) {
3968  INTERESTING("Ontopia");
3969  }
3971  /*
3972  * Ascender
3973  */
3974  if (INFILE(_LT_ASCENDER_EULA) && INFILE(_TITLE_ASCENDER_EULA)) {
3975  INTERESTING("Ascender-EULA");
3976  }
3978  /*
3979  * ADAPTEC
3980  */
3981  if (INFILE(_LT_ADAPTEC_OBJ)) {
3982  INTERESTING("Adaptec.RESTRICTED");
3983  }
3984  else if (INFILE(_CR_ADAPTEC) && INFILE(_LT_ADAPTEC_GPL)) {
3985  INTERESTING("Adaptec-GPL");
3986  }
3988  /*
3989  * Artistic and Perl
3990  */
3991  if (INFILE(_LT_PERL_1)) {
3992  INTERESTING(lDebug ? "Artistic(Perl#1)" : "Artistic-1.0-Perl");
3993  if (!lmem[_mGPL]) {
3994  INTERESTING("Dual-license");
3995  INTERESTING(lDebug ? "GPL(Perl#1)" : "GPL-1.0-or-later");
3996  }
3997  }
3998  else if (INFILE(_LT_PERL_2)) {
3999  INTERESTING(lDebug ? "Artistic(Perl#2)" : "Artistic-1.0-Perl");
4000  if (!lmem[_mGPL]) {
4001  INTERESTING("Dual-license");
4002  INTERESTING(lDebug ? "GPL(Perl#2)" : "GPL-1.0-or-later");
4003  }
4004  }
4005  else if (INFILE(_LT_PERL_3)) {
4006  if (INFILE(_LT_Spencer_86_94_CLAUSE_1) &&
4007  HASTEXT(_LT_PNG_ZLIB_CLAUSE_1, 0) &&
4008  HASTEXT(_LT_PNG_ZLIB_CLAUSE_2, REG_EXTENDED)) {
4009  INTERESTING("Spencer-86");
4010  }
4011  else if (!lmem[_fOPENLDAP] && !TRYGROUP(famOPENLDAP)) {
4012  INTERESTING(lDebug ? "Artistic(Perl#3)" : "Artistic-1.0");
4013  }
4014  }
4015  /*
4016  * Licensed "same as perl itself" will actually be Artistic AND GPL, per
4017  * Larry Wall and the documented licensing terms of "perl"
4018  */
4019  else if (INFILE(_LT_PERLref1)) {
4020  INTERESTING(lDebug ? "Artistic(Perl-ref1)" : "Artistic-1.0-Perl");
4021  if (!lmem[_mGPL]) {
4022  INTERESTING("Dual-license");
4023  INTERESTING(lDebug ? "GPL(Perl-ref1)" : "GPL-1.0-or-later");
4024  }
4025  }
4026  else if (PERL_INFILE(_LT_PERLref2)) {
4027  INTERESTING(lDebug ? "Artistic(Perl-ref2)" : "Artistic-1.0-Perl");
4028  if (!lmem[_mGPL]) {
4029  INTERESTING("Dual-license");
4030  INTERESTING(lDebug ? "GPL(Perl-ref2)" : "GPL-1.0-or-later");
4031  }
4032  }
4033  else if (INFILE(_LT_PERLref3)) {
4034  INTERESTING(lDebug ? "Artistic(Perl-ref3)" : "Artistic-1.0-Perl");
4035  if (!lmem[_mGPL]) {
4036  INTERESTING("Dual-license");
4037  INTERESTING(lDebug ? "GPL(Perl-ref3)" : "GPL-1.0-or-later");
4038  }
4039  }
4040  else if (INFILE(_LT_PERLref4)) {
4041  INTERESTING(lDebug ? "Artistic(Perl-ref4)" : "Artistic-1.0-Perl");
4042  if (!lmem[_mGPL]) {
4043  INTERESTING("Dual-license");
4044  INTERESTING(lDebug ? "GPL(Perl-ref4)" : "GPL-1.0-or-later");
4045  }
4046  }
4047  else if (INFILE(_LT_PERLref5)) {
4048  INTERESTING(lDebug ? "Artistic(Perl-ref5)" : "Artistic-1.0-Perl");
4049  if (!lmem[_mGPL]) {
4050  INTERESTING("Dual-license");
4051  INTERESTING(lDebug ? "GPL(Perl-ref5)" : "GPL-1.0-or-later");
4052  }
4053  }
4054  else if (INFILE(_TITLE_CLARTISTIC)) {
4055  INTERESTING("ClArtistic");
4056  lmem[_fCLA] = 1;
4057  }
4058  else if (!lmem[_fREAL] && !LVAL(_TEXT_GNU_LIC_INFO) &&
4059  (INFILE(_LT_ART_1) || INFILE(_LT_ARTref1) ||
4060  INFILE(_LT_ARTref2) || INFILE(_LT_ARTref3) ||
4061  INFILE(_LT_ARTref4) || PERL_INFILE(_LT_ARTref5) ||
4062  PERL_INFILE(_LT_ARTref6))) {
4063  if (INFILE(_TITLE_OGTSL)) {
4064  INTERESTING("OGTSL");
4065  }
4066  else if (!lmem[_mLIBRE] && !lmem[_fOPENLDAP] &&
4067  !TRYGROUP(famOPENLDAP)) {
4068  if (INFILE(_LT_ART_V2) || INFILE(_TITLE_ART20)) {
4069  INTERESTING(lDebug ? "Artistic(v2.0#1)" : "Artistic-2.0");
4070  }
4071  else if (INFILE(_PHR_Artistic_20)) {
4072  INTERESTING("Artistic-2.0");
4073  }
4074  else if (INFILE(_TITLE_NBPL_V10)) {
4075  INTERESTING("NBPL-1.0");
4076  lmem[_fARTISTIC] = 1;
4077  }
4078  else if(HASTEXT(_PHR_ARTISTIC_PERL, 0)) {
4079  INTERESTING("Artistic-1.0-Perl");
4080  lmem[_fARTISTIC] = 1;
4081  }
4082  else if (HASTEXT(_PHR_ARTISTIC_CLAUSE8, 0))
4083  {
4084  INTERESTING("Artistic-1.0-cl8");
4085  lmem[_fARTISTIC] = 1;
4086  }
4087  else {
4088  INTERESTING(lDebug ? "Artistic(v1.0#other)" : "Artistic-1.0");
4089  lmem[_fARTISTIC] = 1;
4090  }
4091  }
4092  }
4093  else if (INFILE(_LT_ART_2) && INFILE(_TITLE_ART20)) {
4094  INTERESTING(lDebug ? "Artistic(v2.0#2)" : "Artistic-2.0");
4095  }
4096  else if (INFILE(_FILE_ART1) || INFILE(_FILE_ART2)) {
4097  INTERESTING(lDebug ? "Artistic(deb)" : "Artistic-1.0");
4098  }
4099  else if (URL_INFILE(_URL_ART)) {
4100  INTERESTING(lDebug ? "Artistic(url)" : "Artistic-1.0");
4101  }
4103  /*
4104  * LDP, Manpages, OASIS, GPDL, Linux-HOWTO and Linux-doc
4105  */
4106  if (INFILE(_TITLE_LDPL20)) {
4107  INTERESTING("LDPL-2.0");
4108  }
4109  else if (INFILE(_TITLE_LDPL1A)) {
4110  INTERESTING("LDPL-1A");
4111  }
4112  else if (INFILE(_LT_LDPL)) {
4113  INTERESTING(lDebug ? "LDPL(1)" : "LDPL");
4114  }
4115  else if (INFILE(_LT_LDPLref1)) {
4116  INTERESTING(lDebug ? "LDPL(ref1)" : "LDPL");
4117  }
4118  else if (INFILE(_LT_LDPLref2)) {
4119  INTERESTING(lDebug ? "LDPL(ref2)" : "LDPL");
4120  }
4121  else if (INFILE(_LT_LDPLref3)) {
4122  INTERESTING(lDebug ? "LDPL(ref3)" : "LDPL");
4123  }
4124  /*
4125  * GNU-Manpages, Software in the Public Interest (Debian), aka SPI
4126  */
4127  else if (INFILE(_LT_SPI)) {
4128  if (INFILE(_LT_MANPAGE)) {
4129  INTERESTING("GNU-Manpages");
4130  }
4131  else if (!lmem[_fGPL]) {
4132  if (INFILE(_CR_SPI)) {
4133  INTERESTING("Debian-SPI");
4134  }
4135  else {
4136  INTERESTING("Debian-SPI-style");
4137  }
4138  }
4139  }
4140  else if (INFILE(_LT_GPDLref)) {
4141  INTERESTING(lDebug ? "GPDL(1)" : "GPDL");
4142  }
4143  else if (INFILE(_TITLE_GPDL)) {
4144  INTERESTING(lDebug ? "GPDL(2)" : "GPDL");
4145  }
4146  else if (INFILE(_LT_FREEBSD_DOC) && INFILE(_TITLE_FREEBSD_DOC)) {
4147  INTERESTING("FreeBSD-Doc");
4148  }
4149  else if (INFILE(_LT_LINUX_HOWTO)) {
4150  INTERESTING("Linux-HOWTO");
4151  }
4152  else if (INFILE(_LT_LINUXDOC)) {
4153  INTERESTING("LinuxDoc");
4154  }
4155  else if (INFILE(_LT_IEEE_DOC)) {
4156  INTERESTING("IEEE-Doc");
4157  }
4159  /*
4160  * U-Washington
4161  */
4162  if (INFILE(_LT_UW1)) {
4163  if (INFILE(_CR_UWASHINGTON)) {
4164  INTERESTING("U-Wash.Free-Fork");
4165  }
4166  else {
4167  INTERESTING(lDebug ? "U-Wash-style(1)" : "U-Wash-style");
4168  }
4169  }
4170  else if (INFILE(_LT_UW2)) {
4171  if (INFILE(_CR_UWASHINGTON)) {
4172  INTERESTING(lDebug ? "U-Wash(2)" : "U-Washington");
4173  }
4174  else {
4175  INTERESTING(lDebug ? "U-Wash-style(2)" : "U-Wash-style");
4176  }
4177  }
4178  else if (INFILE(_LT_UW3)) {
4179  if (INFILE(_CR_UWASHINGTON)) {
4180  INTERESTING(lDebug ? "U-Wash(3)" : "U-Washington");
4181  }
4182  else {
4183  INTERESTING(lDebug ? "U-Wash-style(3)" : "U-Wash-style");
4184  }
4185  }
4186  else if (INFILE(_LT_UW4)) {
4187  if (INFILE(_CR_UWASHINGTON)) {
4188  INTERESTING(lDebug ? "U-Wash(4)" : "U-Washington");
4189  }
4190  else {
4191  INTERESTING(lDebug ? "U-Wash-style(4)" : "U-Wash-style");
4192  }
4193  }
4195  /*
4196  * WU-ftpd (not the school north of Oregon!
4197  */
4198  if (INFILE(_LT_WU_FTPD)) {
4199  if (INFILE(_TITLE_WU_FTPD) || INFILE(_CR_WASHU)) {
4200  INTERESTING(lDebug ? "Wash-U(1)" : "Wash-U-StLouis");
4201  }
4202  else {
4203  INTERESTING("Wash-U-style");
4204  }
4205  }
4206  else if (INFILE(_LT_WU_FTPDref)) {
4207  INTERESTING(lDebug ? "Wash-U(ref)" : "Wash-U-StLouis");
4208  }
4209  /*
4210  * Delaware
4211  */
4212  else if (INFILE(_LT_DELAWARE)) {
4213  if (INFILE(_CR_DELAWARE)) {
4214  INTERESTING("U-Del");
4215  }
4216  else {
4217  INTERESTING("U-Del-style");
4218  }
4219  }
4220  /*
4221  * Princeton
4222  */
4223  else if (INFILE(_LT_PRINCETON) && NOT_INFILE(_TITLE_WORDNET)) {
4224  if (INFILE(_CR_PRINCETON)) {
4225  INTERESTING("Princeton");
4226  }
4227  else {
4228  INTERESTING("Princeton-style");
4229  }
4230  }
4231  /*
4232  * University of Michigan
4233  */
4234  else if (INFILE(_LT_UMICHIGAN_1)) {
4235  if (INFILE(_CR_MICHIGAN)) {
4236  INTERESTING(lDebug ? "U-Mich(1)" : "U-Michigan");
4237  }
4238  else {
4239  INTERESTING(lDebug ? "U-Mich-style(1)" : "U-Mich-style");
4240  }
4241  }
4242  else if (INFILE(_LT_UMICHIGAN_2)) {
4243  if (INFILE(_CR_MICHIGAN)) {
4244  INTERESTING(lDebug ? "U-Mich(2)" : "U-Michigan");
4245  }
4246  else {
4247  INTERESTING(lDebug ? "U-Mich-style(2)" : "U-Mich-style");
4248  }
4249  }
4250  /*
4251  * Southern Cal
4252  */
4253  else if (INFILE(_LT_USC_NC)) {
4254  if (INFILE(_CR_USC)) {
4255  INTERESTING("USC.Non-commercial");
4256  }
4257  else {
4258  INTERESTING(lDebug ? "NonC(5)" : "Non-commercial");
4259  }
4260  }
4261  else if (INFILE(_LT_USC)) {
4262  if (INFILE(_CR_USC)) {
4263  INTERESTING("USC");
4264  }
4265  else {
4266  INTERESTING("USC-style");
4267  }
4268  }
4269  /*
4270  * Unversity Corporation for Atmospheric Research (UCAR)
4271  */
4272  else if (INFILE(_LT_UCAR_1) && INFILE(_LT_UCAR_2)) {
4273  INTERESTING("UCAR");
4274  }
4275  else if (INFILE(_LT_UCAR_3) && INFILE(_CR_UCAR)) {
4276  if (INFILE(_CR_UCAR)) {
4277  INTERESTING("UCAR");
4278  }
4279  else {
4280  INTERESTING("UCAR-style");
4281  }
4282  }
4283  /*
4284  * Stanford
4285  */
4286  else if (INFILE(_LT_STANFORD)) {
4287  if (INFILE(_CR_STANFORD)) {
4288  INTERESTING("Stanford");
4289  }
4290  else {
4291  INTERESTING("Stanford-style");
4292  }
4293  }
4294  /*
4295  * U-Cambridge
4296  */
4297  else if (INFILE(_LT_CAMBRIDGE)) {
4298  if (HASTEXT(_LT_MSNTP, 0)) {
4299  INTERESTING("MSNTP");
4300  }
4301  else if (INFILE(_CR_CAMBRIDGE_1) || INFILE(_CR_CAMBRIDGE_2)) {
4302  INTERESTING("U-Cambridge");
4303  }
4304  else {
4305  INTERESTING("U-Cambridge-style");
4306  }
4307  }
4308  /*
4309  * Columbia University
4310  */
4311  else if (INFILE(_CR_COLUMBIA) && INFILE(_LT_COLUMBIA)) {
4312  INTERESTING("U-Columbia");
4313  }
4314  /*
4315  * University of Notre Dame (Different from Boost!)
4316  */
4317  if (INFILE(_LT_ND_1)) {
4318  if (INFILE(_CR_NOTREDAME)) {
4319  INTERESTING(lDebug ? "ND(1)" : "NotreDame");
4320  }
4321  else {
4322  INTERESTING(lDebug ? "ND-style(1)" : "NotreDame-style");
4323  }
4324  }
4325  else if (INFILE(_LT_ND_2)) {
4326  if (INFILE(_CR_NOTREDAME)) {
4327  INTERESTING(lDebug ? "ND(2)" : "NotreDame");
4328  }
4329  else {
4330  INTERESTING(lDebug ? "ND-style(2)" : "NotreDame-style");
4331  }
4332  }
4333  else if (INFILE(_LT_ND_3)) {
4334  if (INFILE(_CR_NOTREDAME)) {
4335  INTERESTING(lDebug ? "ND(3)" : "NotreDame");
4336  }
4337  else {
4338  INTERESTING(lDebug ? "ND-style(3)" : "NotreDame-style");
4339  }
4340  }
4342  /*
4343  * Boost references
4344  */
4345  if (!lmem[_mMIT] && INFILE(_LT_BOOST_2)) {
4346  if (INFILE(_CR_BOOST)) {
4347  INTERESTING(lDebug ? "Boost(2)" : "BSL-1.0");
4348  }
4349  else {
4350  INTERESTING(lDebug ? "Boost-style(2)" : "BSL-style");
4351  }
4352  }
4353  else if (INFILE(_LT_BOOSTref1)) {
4354  if (INFILE(_TITLE_BOOST10) || INFILE(_PHR_BOOST_V10) ||
4355  URL_INFILE(_URL_BOOST_10)) {
4356  INTERESTING(lDebug ? "Boost1.0(ref)" : "BSL-1.0");
4357  }
4358  else {
4359  INTERESTING(lDebug ? "Boost(ref)" : "BSL-1.0");
4360  }
4361  }
4362  else if (INFILE(_LT_BOOST_GRAPH)) {
4363  INTERESTING(lDebug ? "Boost(graph)" : "BSL-1.0");
4364  }
4365  else if (INFILE(_LT_BOOST_LAMBDA)) {
4366  INTERESTING(lDebug ? "Boost(lambda)" : "BSL-1.0");
4367  }
4368  else if (URL_INFILE(_URL_BOOST_10)) {
4369  INTERESTING(lDebug ? "Boost-1.0(ref)" : "BSL-1.0");
4370  }
4371  /*
4372  * Sleepycat NON-Commerical
4373  */
4374  else if (INFILE(_LT_SLEEPYCAT_NC)) {
4375  INTERESTING("Sleepycat.Non-commercial");
4376  }
4378  /*
4379  * Vim license
4380  */
4381  if ((INFILE(_LT_Vim_1) || INFILE(_LT_Vim_2)) && INFILE(_TITLE_Vim)) {
4382  INTERESTING("Vim");
4383  }
4384  else if (INFILE(_PHR_Vim)) {
4385  INTERESTING("Vim");
4386  }
4388  /*
4389  * Vixie license
4390  */
4391  if (INFILE(_LT_VIXIE)) {
4392  INTERESTING("Vixie-license");
4393  }
4395  /*
4396  * Yahoo!
4397  */
4398  if (INFILE(_LT_YAHOO_1)) {
4399  if (INFILE(_LT_YAHOO_BINARY)) {
4400  INTERESTING("Yahoo-EULA");
4401  }
4402  else {
4403  INTERESTING("YPL");
4404  }
4405  }
4406  if(INFILE(_TITLE_YPL_V10)) {
4407  INTERESTING("YPL-1.0");
4408  }
4409  else if(INFILE(_TITLE_YPL_V11)) {
4410  INTERESTING("YPL-1.1");
4411  }
4413  /*
4414  * Public Use
4415  */
4416  if (INFILE(_LT_PUBLIC_USE)) {
4417  if (INFILE(_TITLE_PUBUSE_V10)) {
4418  INTERESTING("Public-Use-1.0");
4419  }
4420  else {
4421  INTERESTING("Public-Use");
4422  }
4423  }
4425  /*
4426  * Apple
4427  */
4428  if (INFILE(_TEXT_APPLE)) {
4429  if (INFILE(_LT_MIT_12)) {
4430  INTERESTING(lDebug ? "Apple MIT License" : "AML");
4431  }
4432  else if (INFILE(_LT_APPLE_1)) {
4433  INTERESTING(lDebug ? "Apple(1)" : "Apple");
4434  }
4435  else if (INFILE(_LT_APPLE_2)) {
4436  INTERESTING(lDebug ? "Apple(2)" : "Apple");
4437  }
4438  else if (INFILE(_LT_APPLE_3)) { /* squeak license */
4439  INTERESTING(lDebug ? "Apple(3)" : "Apple");
4440  }
4441  else if (INFILE(_LT_APPLE_4)) { /* squeak license */
4442  INTERESTING(lDebug ? "Apple(4)" : "Apple-EULA");
4443  }
4444  else if (INFILE(_LT_APPLE_FONTFORGE)) {
4445  INTERESTING("Apple.FontForge");
4446  }
4447  else if (INFILE(_LT_APPLE_SAMPLE)) {
4448  INTERESTING("Apple.Sample");
4449  }
4450  else if (INFILE(_LT_APSLref1) || INFILE(_LT_APSLref2) ||
4451  INFILE(_TITLE_APSL)) {
4452  if (INFILE(_TITLE_APSL20)) {
4453  INTERESTING("APSL-2.0");
4454  }
4455  else if (INFILE(_TITLE_Ferris)) {
4456  INTERESTING(lDebug ? "Ferris-1.2" : "APSL-style");
4457  }
4458  else if (INFILE(_TITLE_APSL_style)) {
4459  INTERESTING("APSL-style");
4460  }
4461  else if (INFILE(_TITLE_APSL12)) {
4462  INTERESTING("APSL-1.2");
4463  }
4464  else if (INFILE(_TITLE_APSL11)) {
4465  INTERESTING("APSL-1.1");
4466  }
4467  else if (INFILE(_TITLE_APSL10)) {
4468  INTERESTING("APSL-1.0");
4469  }
4470  else {
4471  INTERESTING("APSL");
4472  }
4473  }
4474  else if (INFILE(_LT_ACDL)) {
4475  INTERESTING("ACDL");
4476  }
4477  else if (INFILE(_TITLE_APPLE_SLA)) {
4478  INTERESTING(lDebug ? "Apple(SLA)" : "Apple-EULA");
4479  }
4480  else if (URL_INFILE(_URL_APSL)) {
4481  INTERESTING(lDebug ? "APSL(url)" : "APSL");
4482  }
4483  else if (URL_INFILE(_URL_ACDL)) {
4484  INTERESTING(lDebug ? "ACDL(url)" : "ACDL");
4485  }
4486  }
4488  /*
4489  * Redland
4490  */
4491  if (INFILE(_LT_REDLAND)) {
4492  INTERESTING("Redland");
4493  }
4495  /*
4496  * Red Hat and Fedora
4497  */
4498  if (INFILE(_LT_RH_PKGS)) {
4499  if (INFILE(_LT_RH_NONCOMMERCIAL)) {
4500  INTERESTING(lDebug ? "RH(NC)" : "RedHat.Non-commercial");
4501  lmem[_mREDHAT] = 1;
4502  }
4503  else if (INFILE(_LT_RH_FEDORA)) {
4504  INTERESTING(lDebug ? "Fedora(1)" : "Fedora");
4505  lmem[_mREDHAT] = 1;
4506  }
4507  }
4508  else if (INFILE(_LT_RH_REDHAT)) {
4509  INTERESTING(lDebug ? "RH(2)" : "RedHat");
4510  lmem[_mREDHAT] = 1;
4511  }
4512  else if (INFILE(_LT_RH_SPECIFIC)) {
4513  INTERESTING(lDebug ? "RH(4)" : "RedHat-specific");
4514  lmem[_mREDHAT] = 1;
4515  }
4516  else if (INFILE(_LT_FEDORA)) {
4517  INTERESTING(lDebug ? "Fedora(2)" : "Fedora");
4518  lmem[_mREDHAT] = 1;
4519  }
4520  else if (INFILE(_LT_FEDORA_CLA) || INFILE(_TITLE_FEDORA_CLA)) {
4521  INTERESTING("FedoraCLA");
4522  lmem[_mREDHAT] = 1;
4523  }
4524  else if (INFILE(_CR_REDHAT)) {
4525  if (INFILE(_LT_RH_1)) {
4526  INTERESTING(lDebug ? "RH(1)" : "RedHat");
4527  lmem[_mREDHAT] = 1;
4528  }
4529  else if (INFILE(_LT_RH_EULA)) {
4530  INTERESTING("RedHat-EULA");
4531  lmem[_mREDHAT] = 1;
4532  }
4533  }
4535  /*
4536  * SUSE/Novell/UnitedLinux
4537  */
4538  if (INFILE(_CR_SUSE) && INFILE(_PHR_YAST_CR)) {
4539  INTERESTING("YaST.SuSE");
4540  }
4541  else if (INFILE(_TITLE_NOVELL_EULA)) {
4542  INTERESTING("Novell-EULA");
4543  }
4544  else if (INFILE(_TITLE_UL_EULA)) {
4545  INTERESTING("UnitedLinux-EULA");
4546  }
4547  else if (INFILE(_LT_NOVELL)) {
4548  INTERESTING("Novell");
4549  lmem[_fIP] = 1;
4550  }
4551  else if (INFILE(_LT_NOVELL_IP_1)) {
4552  INTERESTING(lDebug ? "Novell-IP(1)" : "Novell-IP");
4553  lmem[_fIP] = 1;
4554  }
4555  else if (INFILE(_LT_NOVELL_IP_2)) {
4556  INTERESTING(lDebug ? "Novell-IP(2)" : "Novell-IP");
4557  lmem[_fIP] = 1;
4558  }
4560  /*
4561  * Epson Public license
4562  */
4563  if (INFILE(_LT_EPSON_PL) && INFILE(_TITLE_EPSON_PL)) {
4564  INTERESTING("Epson-PL");
4565  }
4566  else if (INFILE(_LT_EPSON_EULA) && INFILE(_TITLE_EPSON_EULA)) {
4567  INTERESTING("Epson-EULA");
4568  }
4570  /*
4571  * Open Publication license
4572  */
4573  if (INFILE(_LT_OPENPUBL_1) || INFILE(_LT_OPENPUBL_2)) {
4574  if (INFILE(_TITLE_OPENPUBL04)) {
4575  INTERESTING("Open-PL-0.4");
4576  }
4577  else if (INFILE(_TITLE_OPENPUBL10) || URL_INFILE(_URL_OPEN_PL_V10)) {
4578  INTERESTING("Open-PL-1.0");
4579  }
4580  else if (INFILE(_TITLE_OPENPUBL)) {
4581  INTERESTING("Open-PL");
4582  }
4583  else {
4584  INTERESTING("Open-PL-style");
4585  }
4586  }
4587  else if (INFILE(_LT_OPENPUBLref)) {
4588  INTERESTING(lDebug ? "Open-PL(ref)" : "Open-PL");
4589  }
4591  /*
4592  * Free Art License
4593  */
4594  if (INFILE(_LT_FREEART_V10)) {
4595  INTERESTING("FAL-1.0");
4596  }
4597  else if (INFILE(_LT_FREEART_V13)) {
4598  INTERESTING("FAL-1.3");
4599  }
4601  /*
4602  * RSA Security, Inc.
4603  */
4604  if (INFILE(_LT_RSA_4)) {
4605  INTERESTING(lDebug ? "RSA(4)" : "RSA-MD");
4606  }
4607  else if (INFILE(_LT_RSA_5)) {
4608  INTERESTING(lDebug ? "RSA(5)" : "RSA-DNS");
4609  }
4610  else if (INFILE (_LT_RSA_CRYPTOKI_1) && INFILE(_LT_RSA_CRYPTOKI_2)){
4611  INTERESTING("RSA-Cryptoki");
4612  }
4613  else if (INFILE(_LT_RSA_3)) {
4614  INTERESTING(lDebug ? "RSA(3)" : "RSA-Security");
4615  }
4616  else if (INFILE(_CR_RSA)) {
4617  if (INFILE(_LT_RSA_1)) {
4618  INTERESTING(lDebug ? "RSA(1)" : "RSA-Security");
4619  }
4620  else if (INFILE(_LT_RSA_2)) {
4621  INTERESTING(lDebug ? "RSA(2)" : "RSA-Security");
4622  }
4623  }
4625  /* Some licenses only deal with fonts */
4626  if (HASTEXT(_TEXT_FONT, 0)) {
4627  /*
4628  * AGFA Monotype
4629  */
4630  if (INFILE(_LT_AGFA)) {
4631  INTERESTING("AGFA.RESTRICTED");
4632  }
4633  else if (INFILE(_LT_AGFA_EULA)) {
4634  INTERESTING("AGFA-EULA");
4635  }
4636  /*
4637  * Bigelow and Holmes
4638  */
4639  if (INFILE(_LT_BH_FONT)) {
4640  if (INFILE(_CR_BH)) {
4641  INTERESTING("BH-Font");
4642  }
4643  else {
4644  INTERESTING("BH-Font-style");
4645  }
4646  }
4648  /*
4649  * BIZNET
4650  */
4651  if (INFILE(_LT_BIZNET)) {
4652  if (INFILE(_CR_BIZNET)) {
4653  INTERESTING("BIZNET");
4654  }
4655  else {
4656  INTERESTING("BIZNET-style");
4657  }
4658  }
4660  /*
4661  * BITSTREAM
4662  */
4663  if (INFILE(_LT_BITSTREAM_1)) {
4664  INTERESTING(lDebug ? "Bitstream(2)" : "Bitstream");
4665  }
4666  else if (INFILE(_LT_BITSTREAM_2)) {
4667  INTERESTING(lDebug ? "Bitstream(3)" : "Bitstream");
4668  }
4670  /*
4671  * Larabie Fonts
4672  */
4673  if (INFILE(_LT_LARABIE_EULA) && INFILE(_TITLE_LARABIE_EULA)) {
4674  INTERESTING("Larabie-EULA");
4675  }
4677  /*
4678  * Baekmuk Fonts and Hwan Design
4679  */
4680  if (INFILE(_LT_BAEKMUK_1)) {
4681  INTERESTING("Baekmuk-Font");
4682  }
4683  else if (INFILE(_LT_BAEKMUK_2)) {
4684  INTERESTING("Baekmuk.Hwan");
4685  }
4687  /*
4688  * Information-Technology Promotion Agency (IPA)
4689  */
4690  if (INFILE(_LT_IPA_EULA)) {
4691  INTERESTING("IPA-Font-EULA");
4692  }
4694  /*
4695  * Arphic Public License
4696  */
4697  if (INFILE(_LT_ARPHIC)) {
4698  if (INFILE(_CR_ARPHIC)) {
4699  INTERESTING("Arphic-Font-PL");
4700  }
4701  else {
4702  INTERESTING("Arphic-style");
4703  }
4704  }
4705  }
4707  /*
4708  * AT&T
4709  */
4710  if (INFILE(_LT_ATT_1)) {
4711  if (INFILE(_CR_ATT)) {
4712  INTERESTING(lDebug ? "ATT(1)" : "ATT");
4713  }
4714  else {
4715  INTERESTING(lDebug ? "ATT-style(1)" : "ATT-style");
4716  }
4717  }
4718  else if (INFILE(_LT_ATT_2)) {
4719  if (!lmem[_fBSD] && INFILE(_CR_BSDCAL)) {
4720  INTERESTING(lDebug ? "BSD(14)" : "BSD");
4721  lmem[_fBSD] = 1;
4722  }
4723  else if (INFILE(_CR_ATT) || INFILE(_CR_LUCENT)) {
4724  INTERESTING(lDebug ? "ATT(2)" : "ATT");
4725  }
4726  else {
4727  INTERESTING(lDebug ? "ATT-style(2)" : "ATT-style");
4728  }
4729  }
4730  else if (INFILE(_LT_ATT_SRC_1) || INFILE(_LT_ATT_SRC_2)) {
4731  if (INFILE(_TITLE_ATT_SRC_12D)) {
4732  INTERESTING("ATT-Source-1.2d");
4733  }
4734  else if (INFILE(_TITLE_ATT_SRC_10)) {
4735  INTERESTING("ATT-Source-1.0");
4736  }
4737  else {
4738  INTERESTING("ATT-Source");
4739  }
4740  }
4741  else if (INFILE(_LT_ATT_NONCOMMERC1) || INFILE(_LT_ATT_NONCOMMERC2)) {
4742  INTERESTING("ATT.Non-commercial");
4743  }
4745  /*
4746  * Silicon Graphics
4747  */
4748  if (INFILE(_TITLE_SGI_V10)) {
4749  INTERESTING("SGI-B-1.0");
4750  }
4751  else if (INFILE(_TITLE_SGI_V11)) {
4752  INTERESTING("SGI-B-1.1");
4753  }
4754  else if (INFILE(_TITLE_SGI_V20)) {
4755  INTERESTING("SGI-B-2.0");
4756  }
4757  else if (INFILE(_LT_SGI_1)) {
4758  if (HASTEXT(_PHR_SGI_LIBTIFF, REG_EXTENDED)) {
4759  INTERESTING("libtiff");
4760  }
4761  else if (HASTEXT(_PHR_LIBTIFF_STYLE, REG_EXTENDED)) {
4762  INTERESTING("libtiff-style");
4763  }
4764  }
4765  else if (INFILE(_LT_SGI_2)) {
4766  if (INFILE(_LT_SGI_V10)) {
4767  INTERESTING("SGI-B-1.0");
4768  }
4769  else if (INFILE(_LT_SGI_V11)) {
4770  INTERESTING("SGI-B-1.1");
4771  }
4772  else if (INFILE(_LT_SGI_V20)) {
4773  INTERESTING("SGI-B-2.0");
4774  }
4775  else if (INFILE(_CR_SGI) || URL_INFILE(_URL_SGI)) {
4776  INTERESTING("SGI");
4777  }
4778  }
4779  else if (INFILE(_LT_SGI_1)) {
4780  if (INFILE(_CR_SGI) || URL_INFILE(_URL_SGI)) {
4781  INTERESTING("SGI-style");
4782  }
4783  }
4784  else if (INFILE(_LT_SGI_FREEW)) {
4785  INTERESTING("SGI-Freeware");
4786  }
4787  else if (INFILE(_LT_SGI_GLX)) {
4788  if (INFILE(_TITLE_SGI_GLX_V10)) {
4789  INTERESTING(lDebug ? "SGI_GLX(1.0)" : "SGI_GLX-1.0");
4790  }
4791  else {
4792  INTERESTING("SGI_GLX");
4793  }
4794  }
4795  else if (INFILE(_LT_SGI_GLXref) && INFILE(_CR_SGI)) {
4796  if (INFILE(_TITLE_SGI_GLX_V10)) {
4797  INTERESTING(lDebug ? "SGI_GLX(10ref)" : "SGI_GLX-1.0");
4798  }
4799  else {
4800  INTERESTING(lDebug ? "SGI_GLX(ref)" : "SGI_GLX");
4801  }
4802  }
4803  else if (INFILE(_LT_SGI_PROPRIETARY) && INFILE(_CR_SGI)) {
4804  INTERESTING("SGI-Proprietary");
4805  }
4807  /*
4808  * 3DFX (Glide)
4809  */
4810  if (INFILE(_CR_3DFX_1) || INFILE(_CR_3DFX_2)) {
4811  if (INFILE(_LT_GLIDE_3DFX)) {
4812  INTERESTING("Glide");
4813  }
4814  else if (INFILE(_LT_GLIDE_GPL)) {
4815  INTERESTING("3DFX-PL");
4816  }
4817  }
4818  /*
4819  * Nvidia Corp
4820  */
4821  else if (INFILE(_LT_NVIDIA_EULA_3)) {
4822  INTERESTING(lDebug ? "Nvidia(1)" : "Nvidia-EULA-a");
4823  }
4824  else if (INFILE(_CR_NVIDIA) && INFILE(_LT_NVIDIA)) {
4825  INTERESTING(lDebug ? "Nvidia(2)" : "Nvidia");
4826  }
4827  else if (INFILE(_LT_NVIDIA_EULA_2)) {
4828  INTERESTING(lDebug ? "Nvidia(3)" : "Nvidia-EULA-b");
4829  }
4830  else if (INFILE(_LT_NVIDIA_EULA_1) || INFILE(_TITLE_NVIDIA)) {
4831  INTERESTING(lDebug ? "Nvidia(4)" : "Nvidia-EULA-b");
4832  }
4833  else if (INFILE(_LT_NVIDIA_1)) {
4834  INTERESTING(lDebug ? "Nvidia(5)" : "Nvidia");
4835  }
4836  /*
4837  * ATI Corp
4838  */
4839  else if (INFILE(_TITLE_ATI_EULA) && INFILE(_LT_ATI_EULA)) {
4840  INTERESTING("ATI-EULA");
4841  }
4842  /*
4843  * Agere Systems
4844  */
4845  else if (INFILE(_TITLE_AGERE_EULA) && INFILE(_LT_AGERE_EULA)) {
4846  INTERESTING("Agere-EULA");
4847  }
4849  /*
4850  * KD Tools, AB
4851  */
4852  if (INFILE(_TITLE_KDAB_EULA)) {
4853  if (INFILE(_LT_KDAB_1)) {
4854  INTERESTING(lDebug ? "KDAB(1)" : "KD-Tools-EULA");
4855  }
4856  if (INFILE(_LT_KDAB_2)) {
4857  INTERESTING(lDebug ? "KDAB(2)" : "KD-Tools-EULA");
4858  }
4859  }
4861  /*
4862  * KDE
4863  */
4864  if (INFILE(_PHR_KDE_FILE) && INFILE(_LT_KDE)) {
4865  INTERESTING("KDE");
4866  }
4868  /*
4869  * Broadcom
4870  */
4871  if (INFILE(_LT_BROADCOM_EULA) && INFILE(_CR_BROADCOM)) {
4872  INTERESTING("Broadcom-EULA");
4873  }
4875  /*
4876  * DARPA (Defense Advanved Research Projects Agency)
4877  */
4878  if (INFILE(_LT_DARPA_COUGAAR_1)) {
4879  INTERESTING("DARPA-Cougaar");
4880  }
4881  else if (INFILE(_LT_DARPA)) {
4882  INTERESTING("DARPA");
4883  }
4885  /*
4886  * Tektronix
4887  */
4888  if (INFILE(_LT_TEKTRONIX)) {
4889  if (INFILE(_CR_TEKTRONIX)) {
4890  INTERESTING("Tektronix");
4891  }
4892  else {
4893  INTERESTING("Tektronix-style");
4894  }
4895  }
4897  /*
4898  * Alliance for Open Media Patent License
4899  */
4900  if (INFILE(_LT_AOM_Patent)) {
4901  INTERESTING("Alliance for Open Media Patent License 1.0");
4902  }
4904  /*
4905  * Open Market, Inc
4906  */
4907  if (INFILE(_LT_CADENCE) && INFILE(_CR_CADENCE)) {
4908  INTERESTING("Cadence");
4909  }
4911  /*
4912  * Open Market, Inc
4913  */
4914  if (INFILE(_LT_OPENMKT)) {
4915  INTERESTING("OpenMarket");
4916  }
4918  /*
4919  * Unicode
4920  */
4921  if (!lmem[_fUNICODE]) {
4922  if (INFILE(_TITLE_UNICODE)) {
4923  INTERESTING(lDebug ? "Unicode(4)" : "Unicode");
4924  }
4925  else if (INFILE(_LT_UNICODE_1) && INFILE(_CR_UNICODE)) {
4926  INTERESTING(lDebug ? "Unicode(1)" : "Unicode");
4927  }
4928  else if (INFILE(_LT_UNICODE_2)) {
4929  INTERESTING(lDebug ? "Unicode(2)" : "Unicode");
4930  }
4931  else if (INFILE(_LT_UNICODE_3)) {
4932  INTERESTING(lDebug ? "Unicode(3)" : "Unicode");
4933  }
4934  else if (INFILE(_LT_UNICODE_4)) {
4935  INTERESTING(lDebug ? "Unicode(4)" : "Unicode-TOU");
4936  }
4937  else if (URL_INFILE(_URL_UNICODE)) {
4938  INTERESTING(lDebug ? "Unicode(5)" : "Unicode-TOU");
4939  }
4940  else if (INFILE(_TITLE_UNICODE_TOU) && INFILE(_LT_UNICODE_TOU)) {
4941  INTERESTING("Unicode-TOU");
4942  }
4944  }
4945  /*
4946  * Software Research Assoc
4947  */
4948  if (INFILE(_LT_SRA) && INFILE(_CR_SRA)) {
4949  INTERESTING("SW-Research");
4950  }
4952  /*
4953  * MITRE Collaborative Virtual Workspace (CVW) License
4954  */
4955  if (INFILE(_LT_MITRE_1)) {
4956  if (INFILE(_CR_MITRE)) {
4957  INTERESTING(lDebug ? "MitreCVW(1)" : "MitreCVW");
4958  }
4959  else if (INFILE(_TITLE_CVW)) {
4960  INTERESTING(lDebug ? "MitreCVW(2)" : "MitreCVW");
4961  }
4962  else {
4963  INTERESTING("MitreCVW-style");
4964  }
4965  }
4966  else if (INFILE(_LT_MITRE_2)) {
4967  INTERESTING(lDebug ? "Mitre(2)" : "Mitre");
4968  }
4970  /*
4971  * Jabber, Motosoto
4972  */
4973  if (INFILE(_LT_JABBER_1)) {
4974  if (INFILE(_TITLE_MOTOSOTO091)) {
4975  INTERESTING("Motosoto");
4976  }
4977  else if (INFILE(_TITLE_JABBER)) {
4978  INTERESTING("Jabber");
4979  }
4980  }
4981  else if (INFILE(_LT_JABBER_2)) {
4982  if (INFILE(_TITLE_JABBER_V10)) {
4983  INTERESTING(lDebug ? "Jabber(1.0)" : "Jabber-1.0");
4984  }
4985  else {
4986  INTERESTING(lDebug ? "Jabber(2)" : "Jabber");
4987  }
4988  }
4989  else if (URL_INFILE(_URL_JABBER)) {
4990  INTERESTING(lDebug ? "Jabber(url)" : "Jabber");
4991  }
4993  /*
4994  * CPL, Lucent Public License, Eclipse PL
4995  */
4996  int _epl = 0;
4997  if (INFILE(_LT_CPL_1) || INFILE(_LT_CPL_2)) {
4998  if (INFILE(_TITLE_IBM_PL20)) {
4999  INTERESTING("IPL-2.0");
5000  }
5001  else if (INFILE(_TITLE_IBM_PL10)) {
5002  INTERESTING("IPL-1.0");
5003  }
5004  else if (INFILE(_TITLE_IBM_PL)) {
5005  INTERESTING("IPL");
5006  }
5007  else if (INFILE(_TITLE_OpenGroup)) {
5008  INTERESTING("OpenGroup");
5009  }
5010  else if (INFILE(_TITLE_EPL10)) {
5011  INTERESTING(lDebug ? "Eclipse(v.0#1)" : "EPL-1.0");
5012  _epl = 1;
5013  }
5014  else if (INFILE(_TITLE_EPL20)) {
5015  INTERESTING(lDebug ? "Eclipse(v.2#1)" : "EPL-2.0");
5016  _epl = 1;
5017  }
5018  else if (INFILE(_TITLE_EPL) && NOT_INFILE(_TITLE_EPL_IGNORE)) {
5019  INTERESTING(lDebug ? "Eclipse(#1)" : "EPL");
5020  _epl = 1;
5021  }
5022  else if (INFILE(_TITLE_LUCENT102)) {
5023  INTERESTING("LPL-1.02");
5024  }
5025  else if (INFILE(_TITLE_LUCENT10)) {
5026  INTERESTING("LPL-1.0");
5027  }
5028  else if (NOT_INFILE(_LT_CA)) {
5029  cp = CPLVERS();
5030  INTERESTING(lDebug ? "CPL(#1)" : cp);
5031  }
5032  }
5033  else if (INFILE(_LT_LPL_102)) {
5034  INTERESTING("LPL-1.02");
5035  }
5036  else if (!lmem[_fREAL] && INFILE(_LT_CPLref1) && NOT_INFILE(_TITLE_EPL10)) {
5037  cp = CPLVERS();
5038  INTERESTING(lDebug ? "CPL(ref)" : cp);
5039  }
5040  else if (URL_INFILE(_URL_CPL)) {
5041  cp = CPLVERS();
5042  INTERESTING(lDebug ? "CPL(url)" : cp);
5043  }
5044  else if (INFILE(_PHR_CPL_05)) {
5045  INTERESTING(lDebug ? "CPL(0.5)" : "CPL-0.5");
5046  }
5047  else if (INFILE(_PHR_CPL_10)) {
5048  INTERESTING(lDebug ? "CPL(0.5)" : "CPL-1.0");
5049  }
5050  else if (INFILE(_LT_IBM_PLref1)) {
5051  INTERESTING(lDebug ? "IBM-PL(ref)" : "IPL");
5052  }
5053  else if (URL_INFILE(_URL_IBM_PL)) {
5054  INTERESTING(lDebug ? "IBM-PL(url)" : "IPL");
5055  }
5057  /* More EPL cases */
5058  if (!_epl) {
5059  if (INFILE(_LT_EPL20ref_1)) {
5060  INTERESTING(lDebug ? "Eclipse(ref#2)" : "EPL-2.0");
5061  }
5062  else if (INFILE(_LT_EPL10ref_1) || INFILE(_LT_EPL10ref_2) || HASTEXT(_LT_EPL10ref_3, REG_EXTENDED)) {
5063  INTERESTING(lDebug ? "Eclipse(ref#2)" : "EPL-1.0");
5064  }
5065  else if (INFILE(_LT_EPLref)) {
5066  if (INFILE(_TITLE_EPL10)) {
5067  INTERESTING(lDebug ? "Eclipse(v.0#2)" : "EPL-1.0");
5068  }
5069  else if (INFILE(_TITLE_EPL20)) {
5070  INTERESTING(lDebug ? "Eclipse(v.2#2)" : "EPL-2.0");
5071  }
5072  else {
5073  INTERESTING(lDebug ? "Eclipse(#2)" : "EPL");
5074  }
5075  }
5076  else if (INFILE(_LT_EPL10ref_1)) {
5077  INTERESTING(lDebug ? "Eclipse(ref#2)" : "EPL-1.0");
5078  }
5079  else if (INFILE(_LT_EPL) && NOT_INFILE(_TITLE_EPL_IGNORE)) {
5080  if (INFILE(_TITLE_EPL10ref_1)) {
5081  INTERESTING(lDebug ? "Eclipse(v1.0#2)" : "EPL-1.0");
5082  }
5083  if (INFILE(_TITLE_EPL20ref_1)) {
5084  INTERESTING(lDebug ? "Eclipse(v1.0#2)" : "EPL-2.0");
5085  }
5086  }
5087  }
5089  /*
5090  * SyBase/Watcom
5091  */
5092  if (INFILE(_LT_SYBASE)) {
5093  if (INFILE(_TITLE_SYBASE10)) {
5094  INTERESTING("Watcom-1.0");
5095  }
5096  else {
5097  INTERESTING("Watcom");
5098  }
5099  }
5101  /*
5102  * Ricoh
5103  */
5104  if (INFILE(_LT_RICOH)) {
5105  if (INFILE(_TITLE_RICOH10)) {
5106  INTERESTING("RSCPL");
5107  }
5108  }
5110  /*
5111  * OCLC
5112  */
5113  if (INFILE(_LT_OCLC)) {
5114  if (INFILE(_TITLE_OCLC20)) {
5115  INTERESTING("OCLC-2.0");
5116  }
5117  else if (INFILE(_TITLE_OCLC10)) {
5118  INTERESTING("OCLC-1.0");
5119  }
5120  else {
5121  INTERESTING("OCLC");
5122  }
5123  }
5125  /*
5126  * Educational Community License
5127  */
5128  if (INFILE(_LT_ECL1)) {
5129  INTERESTING("ECL-1.0");
5130  lmem[_mMIT] = 1;
5131  }
5132  else if (INFILE(_LT_ECL2)) {
5133  INTERESTING("ECL-2.0");
5134  lmem[_mMIT] = 1;
5135  }
5136  else if (INFILE(_LT_ECL)) {
5137  INTERESTING(lDebug ? "ECL(1)" : "ECL-1.0");
5138  lmem[_mMIT] = 1;
5139  }
5141  /*
5142  * EU DataGrid and Condor PL
5143  */
5144  if (INFILE(_LT_EU)) {
5145  if (INFILE(_TITLE_CONDOR_V10)) {
5146  INTERESTING("Condor-1.0");
5147  } else if (INFILE(_TITLE_CONDOR_V11)) {
5148  INTERESTING("Condor-1.1");
5149  }
5150  else {
5151  INTERESTING("EUDatagrid");
5152  }
5153  }
5154  else if (URL_INFILE(_URL_EUDatagrid)) {
5155  INTERESTING("EUDatagrid");
5156  }
5158  /*
5159  * Adaptive Public License
5160  */
5161  if (INFILE(_LT_ADAPTIVE)) {
5162  if (INFILE(_TITLE_ADAPTIVE10)) {
5163  INTERESTING("APL-1.0");
5164  }
5165  else {
5166  INTERESTING("APL");
5167  }
5168  lmem[_fAPL] = 1;
5169  }
5171  /*
5172  * gSOAP Public License
5173  */
5174  if (!lmem[_mGSOAP] && INFILE(_LT_GSOAPref13)) {
5175  INTERESTING("gSOAP-1.3b");
5176  }
5177  else if (!lmem[_mGSOAP] && INFILE(_LT_GSOAPref)) {
5178  INTERESTING("gSOAP");
5179  }
5181  /*
5182  * Computer Associates
5183  */
5184  if (INFILE(_LT_CA)) {
5185  if (INFILE(_TITLE_CA11)) {
5186  INTERESTING("CATOSL-1.1");
5187  }
5188  else {
5189  INTERESTING("CA");
5190  }
5191  }
5192  else if (INFILE(_TITLE_CA)) {
5193  INTERESTING("CATOSL");
5194  }
5196  /*
5197  * Frameworx
5198  */
5199  if (INFILE(_LT_FRAMEWORX)) {
5200  if (INFILE(_TITLE_FRAMEWORX10)) {
5201  INTERESTING("Frameworx-1.0");
5202  }
5203  else {
5204  INTERESTING("Frameworx");
5205  }
5206  }
5208  /*
5209  * NASA
5210  */
5211  if (INFILE(_LT_NASA)) {
5212  if (INFILE(_TITLE_NASA13)) {
5213  INTERESTING("NASA-1.3");
5214  }
5215  else {
5216  INTERESTING("NASA");
5217  }
5218  }
5220  /*
5221  * Freetype
5222  */
5223  if (INFILE(_LT_FREETYPE)) {
5224  if (INFILE(_TITLE_CATHARON)) {
5225  INTERESTING(lDebug ? "Catharon(1)" : "Catharon");
5226  }
5227  else if (INFILE(_CR_CATHARON)) {
5228  INTERESTING(lDebug ? "Catharon(2)" : "Catharon");
5229  }
5230  else if (INFILE(_TITLE_FREETYPE)) {
5231  INTERESTING("FTL");
5232  }
5233  else {
5234  INTERESTING("FTL-style");
5235  }
5236  }
5237  else if (INFILE(_LT_FTL)) {
5238  INTERESTING("FTL");
5239  }
5240  else if (INFILE(_TITLE_FTL)|| INFILE(_SPDX_FTL)) {
5241  INTERESTING("FTL");
5242  }
5243  else if (INFILE(_LT_CATHARON)) {
5244  INTERESTING(lDebug ? "Catharon(3)" : "Catharon");
5245  }
5246  else if (INFILE(_LT_FREETYPEref)) {
5247  INTERESTING(lDebug ? "FTL(ref)" : "FTL");
5248  }
5250  /*
5251  * Eiffel Forum License
5252  */
5253  if (INFILE(_LT_EIFFEL)) {
5254  if (INFILE(_TITLE_EIFFEL2)) {
5255  INTERESTING("EFL-2.0");
5256  }
5257  else if (INFILE(_TITLE_EIFFEL1)) {
5258  INTERESTING("EFL-1.0");
5259  }
5260  else {
5261  INTERESTING("EFL");
5262  }
5263  }
5264  else if (INFILE(_LT_EIFFEL_20)) {
5265  INTERESTING("EFL-2.0");
5266  }
5267  else if (INFILE(_LT_EIFFEL_1)) {
5268  INTERESTING("EFL");
5269  }
5271  /*
5272  * BISON, Nethack, etc.
5273  */
5274  if (!lmem[_fGPL] && (INFILE(_LT_BISON) || INFILE(_LT_BISONref))) {
5275  if (INFILE(_TITLE_NETHACK)) {
5276  INTERESTING("NGPL");
5277  }
5278  else {
5279  INTERESTING("BISON");
5280  }
5281  }
5283  /*
5284  * Open Software License (OSL) and Academic Free License (AFL) are similar
5285  */
5286  if (INFILE(_LT_OSL_BAD)) {
5287  cp = (INFILE(_TITLE_AFL) ? AFLVERS() : OSLVERS());
5288  INTERESTING(lDebug? "OSL(bad)" : cp);
5289  }
5290  else if (INFILE(_LT_OSLref1)) {
5291  cp = OSLVERS();
5292  INTERESTING(lDebug? "OSL(ref1)" : cp);
5293  }
5294  else if (INFILE(_LT_OSLref2)) {
5295  cp = OSLVERS();
5296  INTERESTING(lDebug? "OSL(ref2)" : cp);
5297  }
5298  else if (INFILE(_LT_AFL)) {
5299  cp = (INFILE(_TITLE_AFL) ? AFLVERS() : OSLVERS());
5300  INTERESTING(lDebug? "AFL#1" : cp);
5301  }
5302  else if (INFILE(_TITLE_OSL21) && NOT_INFILE(_TITLE_OSL21_EXHIBIT)) {
5303  cp = OSLVERS();
5304  INTERESTING(lDebug? "OSL(T2.1)" : cp);
5305  }
5306  else if (INFILE(_TITLE_AFL21)) {
5307  cp = AFLVERS();
5308  INTERESTING(lDebug? "AFL(T2.1)" : cp);
5309  }
5310  else if (INFILE(_TITLE_OSL30) && NOT_INFILE(_TITLE_OSL30_EXHIBIT)) {
5311  cp = OSLVERS();
5312  INTERESTING(lDebug? "OSL(T3.0)" : cp);
5313  }
5314  else if (INFILE(_TITLE_AFL30)) {
5315  cp = AFLVERS();
5316  INTERESTING(lDebug? "AFL(T3.0)" : cp);
5317  }
5318  else if (URL_INFILE(_URL_OSL11)) {
5319  INTERESTING(lDebug ? "OSL_v1.1(url)" : "OSL-1.1");
5320  }
5321  else if (URL_INFILE(_URL_OSL)) {
5322  INTERESTING(lDebug ? "OSL(url)" : "OSL");
5323  }
5324  else if (URL_INFILE(_URL_AFL)) {
5325  INTERESTING(lDebug ? "AFL(url)" : "AFL");
5326  }
5328  /*
5329  * There are occasions where something is licensed under *either* AFL
5330  * or OSL, so don't keep AFL-refs in the if-then-else-if chain here.
5331  */
5332  if (INFILE(_LT_AFLref1)) {
5333  cp = AFLVERS();
5334  INTERESTING(lDebug? "AFL(ref1)" : cp);
5335  }
5336  else if (INFILE(_LT_AFLref2)) {
5337  cp = AFLVERS();
5338  INTERESTING(lDebug? "AFL(ref2)" : cp);
5339  }
5341  /*
5342  * Inner Net license
5343  */
5344  if (INFILE(_LT_INNERNET)) {
5345  if (INFILE(_TITLE_INNERNET200)) {
5346  INTERESTING("InnerNet-2.00");
5347  }
5348  else if (HASTEXT(_TEXT_INNERNET, 0)) {
5349  INTERESTING("InnerNet");
5350  }
5351  else {
5352  INTERESTING("InnerNet-style");
5353  }
5354  }
5355  else if (INFILE(_LT_INNERNETref_V2)) {
5356  INTERESTING(lDebug ? "InnetNet(v2ref)" : "InnerNet-2.00");
5357  }
5359  /*
5360  * Open Government Licence
5361  */
5362  if (INFILE(_TITLE_OGL_UK)) {
5363  if (INFILE(_TITLE_OGL_UK_10)) {
5364  INTERESTING("OGL-UK-1.0");
5365  }
5366  else if (INFILE(_TITLE_OGL_UK_20)) {
5367  INTERESTING("OGL-UK-2.0");
5368  }
5369  else if (INFILE(_TITLE_OGL_UK_30)) {
5370  INTERESTING("OGL-UK-3.0");
5371  }
5372  /* Full OGL license texts have reference to Creative Commons */
5373  if (HASTEXT(_LT_CC_ref, REG_EXTENDED)) {
5374  lmem[_fCCBY] = 1;
5375  }
5376  }
5378  /*
5379  * Creative Commons Public License, Mindterm, and the Reciprocal PL
5380  */
5381  if (!lmem[_fCCBY] && HASTEXT(_LT_CC_ref, REG_EXTENDED)) {
5382  cp = CCVERS();
5383  INTERESTING(lDebug ? "CC(ref)" : cp);
5384  }
5385  else if (INFILE(_LT_CCPL)) {
5386  if (INFILE(_LT_RECIP_1) || INFILE(_LT_RECIP_2)) {
5387  if (INFILE(_TITLE_RPL15)) {
5388  INTERESTING(lDebug ? "RPL-1.5#1" : "RPL-1.5");
5389  }
5390  else if (INFILE(_TITLE_RPL11)) {
5391  INTERESTING(lDebug ? "RPL-1.1#1" : "RPL-1.1");
5392  }
5393  else if (INFILE(_TITLE_RPL10)) {
5394  INTERESTING(lDebug ? "RPL-1.0#1" : "RPL-1.0");
5395  }
5396  else {
5397  INTERESTING(lDebug ? "RPL#1" : "RPL");
5398  }
5399  }
5400  }
5401  else if (INFILE(_LT_RECIP15)) {
5402  INTERESTING("RPL-1.5");
5403  }
5404  else if (INFILE(_TITLE_MINDTERM)) {
5405  INTERESTING("MindTerm");
5406  }
5407  else if (INFILE(_LT_RECIP_1) || INFILE(_LT_RECIP_2)) {
5408  if (INFILE(_TITLE_RPL15)) {
5409  INTERESTING(lDebug ? "RPL-1.5#2" : "RPL-1.5");
5410  }
5411  else if (INFILE(_TITLE_RPL11)) {
5412  INTERESTING(lDebug ? "RPL-1.1#2" : "RPL-1.1");
5413  }
5414  else if (INFILE(_TITLE_RPL10)) {
5415  INTERESTING(lDebug ? "RPL-1.0#2" : "RPL-1.0");
5416  }
5417  else {
5418  INTERESTING(lDebug ? "RPL#2" : "RPL");
5419  }
5420  }
5421  /*
5422  * For some reason license text strings were defined for few
5423  * Creative Commons licenses.
5424  */
5425  else if (INFILE(_LT_CC_BY_SA_30)) {
5426  INTERESTING("CC-BY-SA-3.0");
5427  }
5428  else if (INFILE(_LT_CC_BY_SA_25)) {
5429  INTERESTING("CC-BY-SA-2.5");
5430  }
5431  else if (INFILE(_LT_CC_BY_NC_30)) {
5432  INTERESTING("CC-BY-NC-3.0");
5433  }
5434  else if (INFILE(_LT_CC_BY_ND_30)) {
5435  INTERESTING("CC-BY-ND-3.0");
5436  }
5438  if (URL_INFILE(_URL_RPL)) {
5439  INTERESTING(lDebug ? "RPL(url)" : "RPL");
5440  }
5441  else if (URL_INFILE(_URL_CCLGPL)) {
5442  cp = LGPLVERS();
5443  INTERESTING(lDebug ? "CC-LGPL(url)" : cp);
5444  }
5445  else if (URL_INFILE(_URL_CCGPL)) {
5446  cp = GPLVERS();
5447  INTERESTING(lDebug ? "CC-GPL(url)" : cp);
5448  }
5450  /*
5451  * SpikeSource
5452  */
5453  if (INFILE(_CR_SPIKESOURCE) && INFILE(_LT_SPIKESOURCE)) {
5454  INTERESTING("SpikeSource");
5455  }
5457  /*
5458  * Legato systems
5459  */
5460  if (INFILE(_LT_LEGATO_1) || INFILE(_LT_LEGATO_2)) {
5461  INTERESTING("Legato");
5462  }
5464  /*
5465  * Paradigm associates
5466  */
5467  if (INFILE(_LT_PARADIGM) && INFILE(_CR_PARADIGM)) {
5468  INTERESTING("Paradigm");
5469  }
5471  /*
5472  * Wintertree Software
5473  */
5474  if (INFILE(_LT_WINTERTREE)) {
5475  INTERESTING("Wintertree");
5476  }
5478  /*
5479  * Genivia
5480  */
5481  if (INFILE(_LT_GENIVIAref)) {
5482  INTERESTING("Genivia.Commercial");
5483  }
5485  /*
5486  * Open Directory License
5487  */
5488  if (INFILE(_LT_ODL)) {
5489  INTERESTING("ODL");
5490  }
5492  /*
5493  * Open Directory License
5494  */
5495  if (INFILE(_LT_OSD)) {
5496  INTERESTING("OSD");
5497  }
5499  /*
5500  * Zveno
5501  */
5502  if (INFILE(_LT_ZVENO) && INFILE(_CR_ZVENO)) {
5503  INTERESTING("Zveno");
5504  }
5506  /*
5507  * Brainstorm
5508  */
5509  if (INFILE(_LT_BRAINSTORM_EULA) && INFILE(_TITLE_BRAINSTORM_EULA)) {
5510  INTERESTING("BrainStorm-EULA");
5511  }
5513  /*
5514  * AOL
5515  */
5516  if (INFILE(_LT_AOL_EULA)) {
5517  INTERESTING("AOL-EULA");
5518  }
5520  /*
5521  * Algorithmics
5522  */
5523  if (INFILE(_LT_ALGORITHMICS)) {
5524  INTERESTING("Algorithmics");
5525  }
5527  /*
5528  * Pixware
5529  */
5530  if (INFILE(_LT_PIXWARE_EULA)) {
5531  INTERESTING("Pixware-EULA");
5532  }
5534  /*
5535  * Compuserve
5536  */
5537  if (HASTEXT(_TEXT_COMPUSERVE, 0) && INFILE(_LT_COMPUSERVE)) {
5538  INTERESTING("CompuServe");
5539  }
5541  /*
5542  * Advanved Micro Devices (AMD)
5543  */
5544  if (INFILE(_CR_AMD) && INFILE(_LT_AMD)) {
5545  INTERESTING("AMD");
5546  }
5547  else if (INFILE(_LT_AMD_EULA) && INFILE(_TITLE_AMD_EULA)) {
5548  INTERESTING("AMD-EULA");
5549  }
5551  /*
5552  * OMRON Corp
5553  */
5554  if ((INFILE(_CR_OMRON_1) || INFILE(_CR_OMRON_2)) &&
5555  (INFILE(_LT_OMRON1) || INFILE(_LT_OMRON2))) {
5556  INTERESTING(lDebug ? "OMRON(2)" : "OMRON");
5557  }
5559  /*
5560  * MetroLink
5561  */
5562  if (INFILE(_TITLE_METROLINK)) {
5563  if (INFILE(_LT_METRO)) {
5564  if (INFILE(_LT_METRO_NONFREE)) {
5565  INTERESTING("MetroLink-nonfree");
5566  }
5567  else {
5568  INTERESTING("MetroLink");
5569  }
5570  }
5571  }
5572  else if (INFILE(_LT_METROLINKref)) {
5573  INTERESTING(lDebug ? "MetroLink(ref)" : "MetroLink");
5574  }
5576  /*
5577  * University of Edinburgh (and a CMU derivative)
5578  */
5579  if (INFILE(_LT_EDINBURGH_1)) {
5580  if (mCR_CMU()) {
5581  INTERESTING(lDebug ? "CMU(3)" : "CMU");
5582  lmem[_mCMU] = 1;
5583  }
5584  else if (mCR_EDIN()) {
5585  INTERESTING(lDebug ? "U-Edinburgh(1)" : "U-Edinburgh");
5586  }
5587  else {
5588  INTERESTING(lDebug ? "UE-style(1)" : "U-Edinburgh-style");
5589  }
5590  }
5591  else if (INFILE(_LT_EDINBURGH_2)) {
5592  if (mCR_EDIN()) {
5593  INTERESTING(lDebug ? "U-Edinburgh(2)" : "U-Edinburgh");
5594  }
5595  else {
5596  INTERESTING(lDebug ? "UE-style(2)" : "U-Edinburgh-style");
5597  }
5598  }
5600  /*
5601  * Older CMU (including the weird "fnord" text) licenses.
5602  * Note that SPDX listed MIT-CMU license is detected earlier.
5603  */
5604  if (!lmem[_mCMU] && INFILE(_LT_CMU_1)) {
5605  if (!lmem[_mREDHAT] && INFILE(_CR_REDHAT)) {
5606  INTERESTING(lDebug ? "RH(5)" : "RedHat");
5607  lmem[_mREDHAT] = 1;
5608  }
5609  else if (INFILE(_CR_NRL)) {
5610  INTERESTING("NRL");
5611  }
5612  else if (!lmem[_mCMU] && mCR_CMU()) {
5613  INTERESTING(lDebug ? "CMU(5)" : "CMU");
5614  lmem[_mCMU] = 1;
5615  }
5616  else {
5617  INTERESTING("CMU-style");
5618  lmem[_mCMU] = 1;
5619  }
5620  }
5621  else if (!lmem[_mCMU] && INFILE(_LT_CMU_2) && mCR_CMU()) {
5622  INTERESTING(lDebug ? "CMU(6)" : "CMU");
5623  lmem[_mCMU] = 1;
5624  }
5625  else if (INFILE(_LT_CMU_3)) {
5626  INTERESTING(lDebug ? "CMU(7)" : "CMU");
5627  lmem[_mCMU] = 1;
5628  }
5629  else if (INFILE(_LT_CMU_4)) {
5630  INTERESTING(lDebug ? "CMU(8)" : "CMU");
5631  lmem[_mCMU] = 1;
5632  }
5633  else if (INFILE(_LT_CMU_5)) {
5634  INTERESTING(lDebug ? "CMU(9)" : "CMU");
5635  lmem[_mCMU] = 1;
5636  }
5637  else if (INFILE(_LT_CMU_6)) {
5638  INTERESTING(lDebug ? "CMU(10)" : "CMU");
5639  lmem[_mCMU] = 1;
5640  }
5642  /*
5643  * University of Chicago
5644  */
5645  if (INFILE(_CR_UCHICAGO) && INFILE(_LT_UCHICAGO)) {
5646  INTERESTING("U-Chicago");
5647  }
5649  /*
5650  * University of Utah
5651  */
5652  if (INFILE(_CR_UUTAH) && INFILE(_LT_UUTAH)) {
5653  INTERESTING("U-Utah");
5654  }
5656  /*
5657  * University of British Columbia
5658  */
5659  if (INFILE(_CR_UBC) && INFILE(_LT_UBC)) {
5660  INTERESTING("U-BC");
5661  }
5663  /*
5664  * ImageMagick Studios - DON'T RECALL THE TEXT FOR THIS LICENSE!
5665  */
5666  if (INFILE(_LT_IMAGEMAGICK)) {
5667  if (INFILE(_CR_IMAGEMAGICK)) {
5668  INTERESTING("ImageMagick");
5669  }
5670  else {
5671  INTERESTING("ImageMagick-style");
5672  }
5673  }
5674  else if (URL_INFILE(_URL_IMAGEMAGICK)) {
5675  INTERESTING(lDebug ? "ImageMagick(url)" : "ImageMagick");
5676  }
5678  /*
5679  * Riverbank
5680  */
5681  if (INFILE(_LT_RIVERBANK) && INFILE(_TITLE_RIVERBANK_EULA)) {
5682  INTERESTING("Riverbank-EULA");
5683  }
5685  /*
5686  * Polyserve
5687  */
5688  if (INFILE(_CR_POLYSERVE) && INFILE(_LT_POLYSERVE)) {
5689  INTERESTING("Polyserve-CONFIDENTIAL");
5690  }
5692  /*
5693  * Fujitsu Limited
5694  */
5695  if (INFILE(_CR_FUJITSU) && INFILE(_LT_FUJITSU)) {
5696  INTERESTING("Fujitsu");
5697  }
5699  /*
5700  * Cypress Semiconductor
5701  */
5702  if (INFILE(_CR_CYPRESS) && INFILE(_LT_CYPRESS)) {
5703  INTERESTING("Cypress-FW");
5704  }
5705  /*
5706  * Keyspan
5707  */
5708  else if (INFILE(_CR_KEYSPAN) && INFILE(_LT_KEYSPAN)) {
5709  INTERESTING("Keyspan-FW");
5710  }
5711  /*
5712  * ATMEL
5713  */
5714  else if (INFILE(_CR_ATMEL) && INFILE(_LT_ATMEL)) {
5715  INTERESTING("ATMEL-FW");
5716  }
5718  /*
5719  * Quest Software
5720  */
5721  if (INFILE(_LT_QUEST_EULA) && INFILE(_TITLE_QUEST_EULA)) {
5722  INTERESTING("Quest-EULA");
5723  }
5725  /*
5726  * International Organization for Standarization
5727  */
5728  if (INFILE(_LT_IOS) && INFILE(_CR_IOS)) {
5729  INTERESTING("IOS");
5730  }
5732  /*
5733  * Garmin Ltd.
5734  */
5735  if (INFILE(_LT_GARMIN_EULA) && INFILE(_TITLE_GARMIN_EULA)) {
5736  INTERESTING("Garmin-EULA");
5737  }
5739  /*
5740  * AVM GmbH
5741  */
5742  if (INFILE(_CR_AVM)) {
5743  if (INFILE(_LT_AVM_1)) {
5744  INTERESTING(lDebug ? "AVM(1)" : "AVM");
5745  }
5746  else if (INFILE(_LT_AVM_2)) {
5747  INTERESTING(lDebug ? "AVM(2)" : "AVM");
5748  }
5749  }
5750  else if (INFILE(_LT_AVM_3)) {
5751  INTERESTING(lDebug ? "AVM(3)" : "AVM");
5752  }
5754  /*
5755  * Fair license
5756  */
5757  if (INFILE(_LT_FAIR)) {
5758  if (INFILE(_TITLE_FAIR)) {
5759  INTERESTING("Fair");
5760  }
5761  else {
5762  INTERESTING("Fair-style");
5763  }
5764  }
5766  /*
5767  * GCA (Majordomo)
5768  */
5769  if (INFILE(_LT_GCA)) {
5770  if (INFILE(_TITLE_MAJORDOMO11)) {
5771  INTERESTING("Majordomo-1.1");
5772  }
5773  else {
5774  INTERESTING("Majordomo");
5775  }
5776  }
5778  /*
5779  * Zeus Technology -- this one is kind of a corner-case since the wording
5780  * is VERY general. If there's a Zeus copyright with the license text,
5781  * spell it out; else, look for the same text in the "generic" section.
5782  */
5783  if (INFILE(_CR_ZEUS) && INFILE(_LT_ZEUS)) {
5784  INTERESTING("Zeus");
5785  }
5787  /*
5788  * Information-technology promotion agency
5789  */
5790  if (!lmem[_mXOPEN] && INFILE(_LT_XOPEN_1)) {
5791  if (!lmem[_mOSF] && INFILE(_CR_OSF)) {
5792  INTERESTING(lDebug ? "OSF(2)" : "OSF");
5793  lmem[_mOSF] = 1;
5794  }
5795  else if (INFILE(_CR_UI)) {
5796  INTERESTING(lDebug ? "UI(2)" : "Unix-Intl");
5797  }
5798  else if (INFILE(_CR_XOPEN)) {
5799  INTERESTING(lDebug ? "XOpen(2)" : "X/Open");
5800  lmem[_mXOPEN] = 1;
5801  }
5802  else if (INFILE(_CR_IPA)) {
5803  INTERESTING("IPA");
5804  }
5805  else if (!lmem[_mSUN] && INFILE(_CR_SUN)) {
5806  INTERESTING(lDebug ? "Sun(10)" : "Sun");
5807  lmem[_mSUN] = 1;
5808  }
5809  else {
5810  INTERESTING("X/Open-style");
5811  }
5812  }
5813  /* This one is funky - it includes part of the copyright */
5814  else if (!lmem[_mXOPEN] && INFILE(_LT_XOPEN_2)) {
5815  INTERESTING(lDebug ? "XOpen(3)" : "X/Open");
5816  lmem[_mXOPEN] = 1;
5817  }
5819  /*
5820  * Interlink networks EULA (seen in HP proprietary code)
5821  */
5822  if (INFILE(_LT_INTERLINK_EULA) && INFILE(_TITLE_INTERLINK_EULA)) {
5823  INTERESTING("Interlink-EULA");
5824  }
5826  /*
5827  * Mellanox Technologies
5828  */
5829  if (INFILE(_LT_MELLANOX) && INFILE(_CR_MELLANOX)) {
5830  INTERESTING("Mellanox");
5831  }
5833  /*
5834  * nCipher Corp
5835  */
5836  if (INFILE(_LT_NCIPHER) && INFILE(_CR_NCIPHER)) {
5837  INTERESTING("nCipher");
5838  }
5840  /*
5841  * Distributed Processing Technology Corp
5842  */
5843  if (INFILE(_CR_DPTC) && INFILE(_LT_DPTC)) {
5844  INTERESTING("DPTC");
5845  }
5846  /*
5847  * Distributed Management Task Force
5848  */
5849  else if (HASTEXT(_TEXT_REPRODUCED, 0) && INFILE(_CR_DMTF) &&
5850  INFILE(_LT_DMTF)) {
5851  INTERESTING("DMTF");
5852  lmem[_fATTRIB] = 1;
5853  }
5855  /*
5856  * DSC Technologies Corp
5857  */
5858  if (INFILE(_CR_DSCT) && INFILE(_LT_DSCT)) {
5859  INTERESTING("DSCT");
5860  }
5862  /*
5863  * Epinions, Inc.
5864  */
5865  if (INFILE(_CR_EPINIONS) && INFILE(_LT_EPINIONS)) {
5866  INTERESTING("Epinions");
5867  }
5869  /*
5870  * MITEM, Ltd
5871  */
5872  if (INFILE(_CR_MITEM) && INFILE(_LT_MITEM)) {
5873  INTERESTING("MITEM");
5874  }
5876  /*
5877  * Cylink corp
5878  */
5879  if ((INFILE(_LT_CYLINK_ISC_1) || INFILE(_LT_CYLINK_ISC_2))) {
5880  INTERESTING("Cylink-ISC");
5881  }
5883  /*
5884  * SciTech software
5885  */
5886  if (INFILE(_CR_SCITECH) && INFILE(_LT_SCITECH)) {
5887  INTERESTING("SciTech");
5888  }
5890  /*
5891  * OReilly and Associates
5892  */
5893  if (INFILE(_LT_OREILLY_1)) {
5894  if (INFILE(_CR_OREILLY)) {
5895  INTERESTING("OReilly");
5896  }
5897  else {
5898  INTERESTING("OReilly-style");
5899  }
5900  }
5901  else if (INFILE(_LT_OREILLY_2)) {
5902  if (INFILE(_CR_OREILLY)) {
5903  INTERESTING(lDebug ? "OReilly-2" : "OReilly");
5904  }
5905  else {
5906  INTERESTING(lDebug ? "OReilly-st-2" : "OReilly-style");
5907  }
5908  }
5910  /*
5911  * Bit-Torrent
5912  */
5913  if (INFILE(_LT_BITTORRENT)) {
5914  if (INFILE(_TITLE_BITTORRENT11)) {
5915  INTERESTING("BitTorrent-1.1");
5916  }
5917  else if (INFILE(_TITLE_BITTORRENT10)) {
5918  INTERESTING("BitTorrent-1.0");
5919  }
5920  else {
5921  INTERESTING("BitTorrent");
5922  }
5923  }
5924  else if (INFILE(_LT_BITTORRENT_V11)) {
5925  INTERESTING("BitTorrent-1.1");
5926  }
5927  else if (INFILE(_LT_BITTORRENT_V10)) {
5928  INTERESTING("BitTorrent-1.0");
5929  }
5930  else if (INFILE(_LT_BITTORRENTref)) {
5931  INTERESTING(lDebug ? "BitTorrent(ref)" : "BitTorrent");
5932  }
5934  /*
5935  * Open Software Foundation
5936  */
5937  if (INFILE(_LT_OSF_1)) {
5938  if (INFILE(_CR_OSF)) {
5939  INTERESTING(lDebug ? "OSF(3)" : "OSF");
5940  lmem[_mOSF] = 1;
5941  }
5942  else {
5943  INTERESTING(lDebug ? "OSF-style(1)" : "OSF-style");
5944  }
5945  }
5946  else if (INFILE(_LT_OSF_2)) {
5947  if (INFILE(_CR_OSF)) {
5948  INTERESTING(lDebug ? "OSF(4)" : "OSF");
5949  lmem[_mOSF] = 1;
5950  }
5951  else if (INFILE(_LT_CMU_8)) {
5952  INTERESTING(lDebug ? "CMU(11)" : "CMU");
5953  }
5954  else {
5955  INTERESTING(lDebug ? "OSF-style(2)" : "OSF-style");
5956  }
5957  }
5959  /*
5960  * OpenLDAP (if not already determined above -- the OpenLDAP public license
5961  * borrows text from LOTS of different sources)
5962  */
5963  if (!lmem[_fBSD] && lmem[_tOPENLDAP] && !lmem[_fOPENLDAP]) {
5964  if (INFILE(_LT_OPENLDAP_1)) {
5965  if (!TRYGROUP(famOPENLDAP)) {
5966  INTERESTING("OLDAP-style");
5967  }
5968  }
5969  else if (INFILE(_LT_OPENLDAP_2)) {
5970  INTERESTING("OLDAP");
5971  }
5972  }
5974  /*
5975  * The Knuth license is sufficiently bizarre enough it belongs down here,
5976  * towards the end of the search
5977  *****
5978  * Lachman Associates - includes a proprietary-to-the-max paragraph
5979  * IoSoft Ltd.
5980  */
5981  if (INFILE(_CR_KNUTH) && INFILE(_LT_KNUTH_1)) {
5982  INTERESTING(lDebug ? "Knuth(1)" : "D.E.Knuth");
5983  }
5984  else if (INFILE(_LT_KNUTH_2)) {
5985  INTERESTING(lDebug ? "Knuth(2)" : "D.E.Knuth");
5986  }
5987  else if (INFILE(_LT_KNUTH_STYLE)) {
5988  INTERESTING("Knuth-style");
5989  }
5990  else if (INFILE(_LT_LACHMAN_SECRET)) {
5991  INTERESTING("Lachman-Proprietary");
5992  }
5993  else if (INFILE(_LT_IOSOFT_SRCONLY)) {
5994  INTERESTING("IoSoft.COMMERCIAL");
5995  }
5997  /*
5998  * The Free Software License
5999  */
6000  if (INFILE(_LT_FREE_SW)) {
6001  INTERESTING("Free-SW");
6002  }
6003  /*
6004  * NOT free software and explicitly free software
6005  */
6006  else if (INFILE(_PHR_NOT_FREE_SW)) {
6007  if (INFILE(_LT_NOT_FREE) && INFILE(_CR_WTI)) {
6008  INTERESTING("WTI.Not-free");
6009  }
6010  else {
6011  INTERESTING("Not-Free");
6012  }
6013  }
6015  /*
6016  * Code Project Open License
6017  */
6018  if (INFILE(_LT_CPOL)) {
6019  if (HASTEXT(_LT_CPOL_V102, REG_EXTENDED)) {
6020  INTERESTING("CPOL-1.02");
6021  } else {
6022  INTERESTING("CPOL");
6023  }
6024  }
6026  /*
6027  * Macrovision
6028  */
6029  if (INFILE(_LT_MACROV_IA) && INFILE(_PHR_MACROVISION)) {
6030  if (INFILE(_PHR_EULA)) {
6031  INTERESTING("Macrovision-EULA");
6032  }
6033  else {
6034  INTERESTING("Macrovision");
6035  }
6036  }
6038  /*
6039  * VMware
6040  */
6041  if (INFILE(_LT_VMWARE) && INFILE(_TITLE_VMWARE)) {
6042  INTERESTING("VMware-EULA");
6043  }
6045  /*
6046  * UCWARE.com
6047  */
6048  if (INFILE(_LT_UCWARE_EULA_1) || INFILE(_LT_UCWARE_EULA_2)) {
6049  INTERESTING("UCWare-EULA");
6050  }
6052  /*
6053  * InfoSeek Corp
6054  */
6055  if (INFILE(_LT_INFOSEEK) && INFILE(_CR_INFOSEEK)) {
6056  INTERESTING("InfoSeek");
6057  }
6059  /*
6060  * Trident Microsystems
6061  */
6062  if (INFILE(_LT_TRIDENT_EULA) && INFILE(_CR_TRIDENT)) {
6063  INTERESTING("Trident-EULA");
6064  }
6066  /*
6067  * ARJ Software Inc
6068  */
6069  if (INFILE(_LT_ARJ) && INFILE(_CR_ARJ)) {
6070  INTERESTING("ARJ");
6071  }
6073  /*
6074  * Piriform Ltd
6075  */
6076  if (INFILE(_LT_PIRIFORM) && INFILE(_CR_PIRIFORM)) {
6077  INTERESTING("Piriform");
6078  }
6080  /*
6081  * Design Science License (DSL)
6082  */
6083  if (INFILE(_LT_DSL)) {
6084  INTERESTING("DSL");
6085  }
6087  /*
6088  * Skype
6089  */
6090  if (INFILE(_TITLE_SKYPE) && INFILE(_LT_SKYPE)) {
6091  INTERESTING("Skype-EULA");
6092  }
6094  /*
6095  * Hauppauge
6096  */
6097  if (INFILE(_LT_HAUPPAUGE)) {
6098  INTERESTING("Hauppauge");
6099  }
6101  /*
6102  * Platform Computing Corp (or a generic on-your-intranet-only restriction)
6103  */
6104  if (INFILE(_LT_INTRANET_ONLY)) {
6105  if (INFILE(_CR_PLATFORM_COMP)) {
6106  INTERESTING(lDebug ? "Platfm(1)" : "Platform-Computing(RESTRICTED)");
6107  } else {
6108  MEDINTEREST("Intranet-only");
6109  }
6110  } else if (INFILE(_LT_NOT_INTERNET)) {
6111  if (INFILE(_CR_PLATFORM_COMP)) {
6112  INTERESTING(lDebug ? "Platfm(2)" : "Platform-Computing(RESTRICTED)");
6113  } else {
6114  MEDINTEREST("Not-Internet");
6115  }
6116  }
6118  /*
6119  * Curl
6120  */
6121  if (URL_INFILE(_URL_CURL)) {
6122  INTERESTING(lDebug ? "Curl(URL)" : "curl");
6123  }
6125  /*
6126  * ID Software
6127  */
6128  if (INFILE(_LT_ID_EULA)) {
6129  INTERESTING("ID-EULA");
6130  }
6132  /*
6133  * M+ Fonts Project
6134  */
6135  if (INFILE(_LT_MPLUS_FONT) && INFILE(_CR_MPLUS)) {
6136  INTERESTING("M-Plus-Project");
6137  }
6139  /*
6140  * Powder Development
6141  */
6142  if (INFILE(_LT_POWDER)) {
6143  INTERESTING("Powder-Proprietary");
6144  }
6146  /*
6147  * Against DRM
6148  */
6149  if (INFILE(_LT_AGAINST_DRM)) {
6150  INTERESTING("AgainstDRM");
6151  }
6153  /*
6154  * The TeXinfo exception clause
6155  */
6156  if (INFILE(_LT_TEX_EXCEPT)) {
6157  INTERESTING(lDebug ? "TeX-except" : "TeX-exception");
6158  }
6160  /*
6161  * The U.S. Gummint
6162  */
6163  if (INFILE(_LT_USGOVT_1)) {
6164  if (INFILE(_CR_URA)) {
6165  MEDINTEREST("URA.govt");
6166  }
6167  else {
6168  MEDINTEREST(lDebug ? "Govt-Wk(1)" : "Govt-work");
6169  }
6170  }
6171  else if (INFILE(_LT_USGOVT_2)) {
6172  /*
6173  * mpich2
6174  */
6175  if (INFILE(_LT_MPICH2)) {
6176  INTERESTING("mpich2");
6177  }
6178  else {
6179  MEDINTEREST(lDebug ? "Govt-Wk(2)" : "Govt-work");
6180  }
6181  }
6182  else if (INFILE(_LT_USGOVT_RIGHTS1) && INFILE(_LT_PUBLIC)) {
6183  MEDINTEREST(lDebug ? "US-Govt(1)" : "Govt-rights");
6184  }
6185  else if (INFILE(_LT_USGOVT_RIGHTS2)) {
6186  MEDINTEREST(lDebug ? "US-Govt(2)" : "Govt-rights");
6187  }
6189  /*
6190  * AACA (Ada Conformity Assessment Authority)
6191  */
6192  if (INFILE(_LT_ACAA_RIGHTS) && INFILE(_LT_PUBLIC)) {
6193  INTERESTING("ACAA");
6194  }
6196  /*
6197  * Zend Engine License
6198  */
6199  if (INFILE(_LT_ZEND_1) || URL_INFILE(_URL_ZEND)) {
6200  INTERESTING("Zend-2.0");
6201  }
6202  else if (INFILE(_LT_ZEND_2)) {
6203  INTERESTING("Zend-1.0");
6204  }
6206  /*
6207  * WebM
6208  * Changed to BSD-3-Clause, WebM is not OSI nor SPDX recognized license
6209  */
6210  if (URL_INFILE(_URL_WEBM)) {
6211  INTERESTING(lDebug ? "WebM" : "BSD-3-Clause");
6212  }
6214  /* Dyade Public License
6215  * http://old.koalateam.com/jackaroo/DYADE_PUBLIC_LICENSE.TXT
6216  */
6217  if (INFILE(_LT_DYADE) && INFILE(_LT_DYADE_2))
6218  {
6219  INTERESTING("Dyade");
6220  }
6221  /*
6222  * Zimbra
6223  */
6224  if (INFILE(_TITLE_ZIMBRA_13)) {
6225  INTERESTING("Zimbra-1.3");
6226  }
6227  else if (INFILE(_TITLE_ZIMBRA_12)) {
6228  INTERESTING("Zimbra-1.2");
6229  }
6230  else if (INFILE(_TITLE_ZIMBRA)) {
6231  INTERESTING("Zimbra");
6232  }
6234  /*
6235  * Open Database
6236  */
6237  if (INFILE(_TITLE_ODBL)) {
6238  INTERESTING("ODbL-1.0");
6239  lmem[_fODBL] = 1;
6240  }
6242  /*
6243  * Multics
6244  */
6245  if (INFILE(_LT_MULTICS)) {
6246  INTERESTING("Multics");
6247  }
6249  /*
6250  * H2
6251  * Note, H2 title is also checked in MPL section
6252  */
6253  if (INFILE(_TITLE_H2_V10)) {
6254  INTERESTING("H2-1.0");
6255  }
6257  /*
6258  * CRYPTOGAMS
6259  */
6260  if (INFILE(_LT_CRYPTOGAMS)) {
6261  INTERESTING("Cryptogams");
6262  }
6264  /*
6265  * Cygnus-eCos-1.0
6266  * Note, Cygnus-eCos title is also checked in MPL section
6267  */
6268  if (INFILE(_TITLE_CYGNUS_ECOS_V10)) {
6269  INTERESTING("Cygnus-eCos-1.0");
6270  }
6272  /*
6273  * RHeCos-1.1
6274  * Note, RHeCos-1.1 title is also checked in MPL section
6275  */
6276  if (INFILE(_TITLE_RHeCos_V11)) {
6277  INTERESTING("RHeCos-1.1");
6278  }
6280  /*
6281  * TMate
6282  * Note, TMate is also recognized with BSD-2-Clause detection
6283  */
6284  if (INFILE(_TITLE_TMATE)) {
6285  INTERESTING("TMate");
6286  }
6288  /*
6289  * Abstyles
6290  */
6291  if (INFILE(_LT_ABSTYLES_1) && INFILE(_LT_ABSTYLES_2)) {
6292  INTERESTING("Abstyles");
6293  }
6295  /*
6296  * Amazon Digital Services License
6297  */
6298  if (INFILE(_LT_ADSL) && INFILE(_CR_AMAZON)) {
6299  INTERESTING("ADSL");
6300  }
6302  /*
6303  * CrystalStacker License
6304  */
6305  if (HASTEXT(_LT_CRYSTALSTACKER, REG_EXTENDED)) {
6306  INTERESTING("CrystalStacker");
6307  }
6309  /*
6310  * 3GPP
6311  */
6312  if (INFILE(_LT_3GPP)) {
6313  INTERESTING("3GPP");
6314  }
6316  /*
6317  * ITU-T
6318  */
6319  if (INFILE(_LT_ITU_T_1) || INFILE(_LT_ITU_T_2) || HASTEXT(_TITLE_ITU_T, 0)) {
6320  INTERESTING("ITU-T");
6321  }
6323  /*
6324  * Sun Public License
6325  */
6326  if (!lmem[_mSUN] && !lmem[_mMPL]) {
6327  if (INFILE(_TITLE_SUN_PL10)) {
6328  INTERESTING("SPL-1.0");
6329  }
6330  else if (!lmem[_fREAL] && INFILE(_TITLE_SUN_PL)) {
6331  INTERESTING("SPL");
6332  }
6333  }
6335  /*
6336  * libtiff, note that license text is detected earlier
6337  */
6338  if (INFILE(_PHR_LIBTIFF)) {
6339  INTERESTING("libtiff");
6340  }
6342  /*
6343  * Imlib2
6344  */
6345  if (INFILE(_PHR_Imlib2)) {
6346  INTERESTING("Imlib2");
6347  }
6349  /*
6350  * Wide Open License (WOL)
6351  */
6352  if (INFILE(_TITLE_WOL) || INFILE(_URL_WOL)) {
6353  INTERESTING("WOL");
6354  }
6356  /*
6357  * naist-2003
6358  */
6359  if (INFILE(_LT_NAIST_2003) && HASTEXT(_TEXT_NAIST, 0)) {
6360  INTERESTING("naist-2003");
6361  }
6363  /*
6364  * EDL-1.0
6365  */
6366  if (INFILE(_TITLE_EDL_V10)) {
6367  INTERESTING("EDL-1.0");
6368  }
6370  /*
6371  * HSQLDB
6372  */
6373  if (INFILE(_LT_HSQLDB_1) || INFILE(_LT_HSQLDB_2) || INFILE(_LT_HSQLDB_3)) {
6374  INTERESTING("HSQLDB");
6375  }
6377  /*
6378  * Sony Computer Entertainment (SCEA) Shared Source License
6379  */
6380  if (INFILE(_TITLE_SCEA)) {
6381  INTERESTING("SCEA");
6382  }
6384  /*
6385  * OpenMap
6386  */
6387  if (INFILE(_TITLE_OPENMAP)) {
6388  INTERESTING("OpenMap");
6389  lmem[_fPDDL] = 1;
6390  }
6392  /*
6393  * ICU 1.8.1
6394  */
6395  if (INFILE(_LT_ICU_1) || INFILE(_TITLE_ICU) || INFILE(_SPDX_ICU)) {
6396  INTERESTING("ICU");
6397  }
6398  else if (INFILE(_PHR_ICU_1)) {
6399  INTERESTING("ICU");
6400  }
6402  /*
6403  * Ubuntu Font License
6404  */
6405  if (INFILE(_TITLE_UBUNTU_FONT)) {
6406  INTERESTING("ubuntu-font-1.0");
6407  lmem[_fPDDL] = 1;
6408  }
6410  /*
6411  * ODC Attribution License
6412  */
6413  if (INFILE(_LT_ODC)) {
6414  INTERESTING("ODC-By-1.0");
6415  pd = 0;
6416  }
6418  /*
6419  * Community Data License Agreement
6420  */
6421  if (INFILE(_TITLE_CDLA_Permissive_10)) {
6422  INTERESTING("CDLA-Permissive-1.0");
6423  }
6424  else if (INFILE(_TITLE_CDLA_Sharing_10)) {
6425  INTERESTING("CDLA-Sharing-1.0");
6426  }
6428  /*
6429  * Toolbar2000
6430  */
6431  if (INFILE(_TITLE_Toolbar2000) || INFILE(_URL_Toolbar2000)) {
6432  INTERESTING("Toolbar2000");
6433  }
6435  /*
6436  * unboundID-ldap-sdk
6437  */
6438  if (INFILE(_TITLE_unboundID_ldap_sdk) || INFILE(_LT_unboundID_ldap_sdk)) {
6439  INTERESTING("unboundID-ldap-sdk");
6440  }
6442  /*
6443  * BlueOak-1.0.0
6444  */
6445  if (INFILE(_TITLE_BlueOak_100) || URL_INFILE(_URL_BlueOak_100)) {
6446  INTERESTING("BlueOak-1.0.0");
6447  }
6448  else if (INFILE(_LT_BlueOak_100_Purpose) && INFILE(_LT_BlueOak_100_Acceptance)) {
6449  INTERESTING("BlueOak-1.0.0");
6450  }
6452  /*
6453  * CERN-OHL
6454  */
6455  if (INFILE(_TITLE_CERN_OHL_11)) {
6456  INTERESTING("CERN-OHL-1.1");
6457  }
6458  else if (INFILE(_TITLE_CERN_OHL_12)) {
6459  INTERESTING("CERN-OHL-1.2");
6460  }
6462  /*
6463  * MulanPSL
6464  */
6465  if (INFILE(_TITLE_MulanPSL_10) || URL_INFILE(_URL_MulanPSL) || INFILE(_LT_MulanPSL_10)) {
6466  INTERESTING("MulanPSL-1.0");
6467  }
6469  /*
6470  * SSH
6471  */
6472  if (INFILE(_LT_FREE_72) && HASTEXT(_LT_SSH, REG_EXTENDED)) {
6473  if (INFILE(_LT_SSH_OpenSSH)) {
6474  INTERESTING("SSH-OpenSSH");
6475  }
6476  else {
6477  INTERESTING("SSH-short");
6478  }
6479  }
6481 
6482  SPDXREF();
6484  EXCEPTIONS();
6486 
6487  /*
6488  * The Stallman paper "Why Software Should Be Free" is a red-herring.
6489  * His 1986 interview in Byte magazine also is, too.
6490  */
6491  if ((INFILE(_TITLE_RMS_WSSBF) && INFILE(_PHR_RMS1) &&
6492  INFILE(_PHR_RMS2)) || INFILE(_TITLE_RMS_BYTE86)) {
6493  if (lDiags) {
6494  printf("... RMS propaganda\n");
6495  }
6496  lmem[_fDOC] = 1;
6497  }
6499  /*
6500  * If there's a no-warranty statement in the file, remember the regex.
6501  * Ditto for phrase stating restrictions.
6502  */
6503  if (maxInterest != IL_HIGH) {
6504  for (i = 0; i < NNOWARRANTY; i++) {
6505  if (INFILE((j = _NO_WARRANTY_first+i))) {
6506  nw = j;
6507  break;
6508  }
6509  }
6510  }
6511  addLicence(cur.theMatches,"NoWarranty");
6512 
6513  /*
6514  * Statements about IP (Intellectual Property) rights
6515  */
6516  if (!lmem[_fIP] && INFILE(_LT_GEN_IP_1)) {
6517  INTERESTING(lDebug ? "IP(1)" : "IP-claim");
6518  }
6519  else if (!lmem[_fIP] && INFILE(_LT_GEN_IP_2) && NOT_INFILE(_TITLE_MIROS)) {
6520  INTERESTING(lDebug ? "IP(2)" : "IP-claim");
6521  }
6522  else if (!lmem[_fIP] && INFILE(_LT_GEN_IP_3)) {
6523  INTERESTING(lDebug ? "IP(3)" : "IP-claim");
6524  }
6526  /*
6527  * Dual licenses
6528  */
6529  if (INFILE(_LT_DUAL_LICENSE_0) && NOT_INFILE(_TITLE_NOSL)) {
6530  MEDINTEREST(lDebug ? "Dual-license(0)" : "Dual-license");
6531  }
6532  else if (INFILE(_LT_DUAL_LICENSE_22)) {
6533  MEDINTEREST(lDebug ? "Dual-license(22)" : "Dual-license");
6534  }
6535  else if (INFILE(_LT_DUAL_LICENSE_1) && NOT_INFILE(_TITLE_NOSL)) {
6536  MEDINTEREST(lDebug ? "Dual-license(1)" : "Dual-license");
6537  }
6538  else if (INFILE(_LT_DUAL_LICENSE_2)) {
6539  MEDINTEREST(lDebug ? "Dual-license(2)" : "Dual-license");
6540  }
6541  else if (INFILE(_LT_DUAL_LICENSE_3) && NOT_INFILE(_LT_DUAL_LICENSE_3_EXHIBIT)) {
6542  MEDINTEREST(lDebug ? "Dual-license(3)" : "Dual-license");
6543  }
6544  else if (INFILE(_LT_DUAL_LICENSE_4)) {
6545  MEDINTEREST(lDebug ? "Dual-license(4)" : "Dual-license");
6546  }
6547  else if (INFILE(_LT_DUAL_LICENSE_5)) {
6548  MEDINTEREST(lDebug ? "Dual-license(5)" : "Dual-license");
6549  }
6550  else if (INFILE(_LT_DUAL_LICENSE_6)) {
6551  MEDINTEREST(lDebug ? "Dual-license(6)" : "Dual-license");
6552  }
6553  else if (INFILE(_LT_DUAL_LICENSE_7)) {
6554  MEDINTEREST(lDebug ? "Dual-license(7)" : "Dual-license");
6555  }
6556  else if (INFILE(_LT_DUAL_LICENSE_8)) {
6557  MEDINTEREST(lDebug ? "Dual-license(8)" : "Dual-license");
6558  }
6559  else if (INFILE(_LT_DUAL_LICENSE_9)) {
6560  MEDINTEREST(lDebug ? "Dual-license(9)" : "Dual-license");
6561  }
6562  else if (INFILE(_LT_DUAL_LICENSE_10)) {
6563  MEDINTEREST(lDebug ? "Dual-license(10)" : "Dual-license");
6564  }
6565  else if (INFILE(_LT_DUAL_LICENSE_11)) {
6566  MEDINTEREST(lDebug ? "Dual-license(11)" : "Dual-license");
6567  }
6568  else if (INFILE(_LT_DUAL_LICENSE_12)) {
6569  MEDINTEREST(lDebug ? "Dual-license(12)" : "Dual-license");
6570  }
6571  else if (INFILE(_LT_DUAL_LICENSE_13)) {
6572  INTERESTING(lDebug ? "Dual-license(13)" : "Dual-license");
6573  INTERESTING("BSD");
6574  INTERESTING("MIT");
6575  /*
6576  * A special case for NomosTestfiles/Dual-license/respond.js
6577  * that has two dual-license statements.
6578  */
6579  if (!lmem[_mGPL]) {
6580  if (INFILE(_LT_DUAL_LICENSE_16)) {
6581  INTERESTING(lDebug ? "GPLV2(Dual-license(16))" : "GPL-2.0-only");
6582  }
6583  }
6584  }
6585  else if (INFILE(_LT_DUAL_LICENSE_14)) {
6586  INTERESTING(lDebug ? "Dual-license(14)" : "Dual-license");
6587  INTERESTING("BSD");
6588  if (!lmem[_mGPL]) {
6589  INTERESTING("GPL");
6590  }
6591  }
6592  else if (INFILE(_LT_DUAL_LICENSE_15)) {
6593  MEDINTEREST(lDebug ? "Dual-license(15)" : "Dual-license");
6594  }
6595  else if (INFILE(_LT_DUAL_LICENSE_16)) {
6596  INTERESTING(lDebug ? "Dual-license(16)" : "Dual-license");
6597  INTERESTING("MIT");
6598  INTERESTING(lDebug ? "GPLV2(Dual-license(16))" : "GPL-2.0-only");
6599  }
6600  else if (INFILE(_LT_DUAL_LICENSE_17)) {
6601  MEDINTEREST(lDebug ? "Dual-license(17)" : "Dual-license");
6602  }
6603  else if (INFILE(_LT_DUAL_LICENSE_18)) {
6604  MEDINTEREST(lDebug ? "Dual-license(18)" : "Dual-license");
6605  }
6606  else if (INFILE(_LT_DUAL_LICENSE_19)) {
6607  MEDINTEREST(lDebug ? "Dual-license(19)" : "Dual-license");
6608  }
6609  else if (INFILE(_LT_DUAL_LICENSE_20)) {
6610  MEDINTEREST(lDebug ? "Dual-license(20)" : "Dual-license");
6611  }
6612  else if (INFILE(_LT_DUAL_LICENSE_21)) {
6613  MEDINTEREST(lDebug ? "Dual-license(21)" : "Dual-license");
6614  }
6615  else if (INFILE(_LT_DUAL_LICENSE_23)) {
6616  MEDINTEREST(lDebug ? "Dual-license(23)" : "Dual-license");
6617  }
6618  else if (INFILE(_LT_DUAL_LICENSE_24)) {
6619  MEDINTEREST(lDebug ? "Dual-license(24)" : "Dual-license");
6620  }
6621  else if (INFILE(_LT_DUAL_LICENSE_25)) {
6622  MEDINTEREST(lDebug ? "Dual-license(25)" : "Dual-license");
6623  }
6624  else if (INFILE(_LT_DUAL_LICENSE_26)) {
6625  MEDINTEREST(lDebug ? "Dual-license(26)" : "Dual-license");
6626  }
6627  else if (INFILE(_LT_DUAL_LICENSE_27)) {
6628  MEDINTEREST(lDebug ? "Dual-license(27)" : "Dual-license");
6629  }
6630  else if (INFILE(_LT_DUAL_LICENSE_28)) {
6631  MEDINTEREST(lDebug ? "Dual-license(28)" : "Dual-license");
6632  }
6633  else if (INFILE(_LT_DUAL_LICENSE_29) && NOT_INFILE(_LT_MPL_SECONDARY_LICENSE)) {
6634  MEDINTEREST(lDebug ? "Dual-license(29)" : "Dual-license");
6635  }
6636  else if (INFILE(_LT_DUAL_LICENSE_30)) {
6637  MEDINTEREST(lDebug ? "Dual-license(30)" : "Dual-license");
6638  }
6639  else if (INFILE(_LT_DUAL_LICENSE_31)) {
6640  MEDINTEREST(lDebug ? "Dual-license(31)" : "Dual-license");
6641  }
6642  else if (INFILE(_LT_DUAL_LICENSE_32)) {
6643  MEDINTEREST(lDebug ? "Dual-license(32)" : "Dual-license");
6644  }
6645  else if (INFILE(_LT_DUAL_LICENSE_33)) {
6646  MEDINTEREST(lDebug ? "Dual-license(33)" : "Dual-license");
6647  }
6648  else if (INFILE(_LT_DUAL_LICENSE_34)) {
6649  MEDINTEREST(lDebug ? "Dual-license(34)" : "Dual-license");
6650  }
6651  else if (HASTEXT(_LT_DUAL_LICENSE_35, 0)) {
6652  MEDINTEREST(lDebug ? "Dual-license(35)" : "Dual-license");
6653  /*
6654  * GPL is not detected correctly in this case, therefore it is set here.
6655  */
6656  INTERESTING("GPL");
6657  }
6658  else if (INFILE(_LT_DUAL_LICENSE_36)) {
6659  MEDINTEREST(lDebug ? "Dual-license(36)" : "Dual-license");
6660  }
6661  else if (INFILE(_LT_DUAL_LICENSE_37)) {
6662  MEDINTEREST(lDebug ? "Dual-license(37)" : "Dual-license");
6663  }
6664  else if (INFILE(_LT_DUAL_LICENSE_38)) {
6665  MEDINTEREST(lDebug ? "Dual-license(38)" : "Dual-license");
6666  }
6667  else if (INFILE(_LT_DUAL_LICENSE_39)) {
6668  MEDINTEREST(lDebug ? "Dual-license(39)" : "Dual-license");
6669  }
6670  else if (INFILE(_LT_DUAL_LICENSE_40)) {
6671  MEDINTEREST(lDebug ? "Dual-license(40)" : "Dual-license");
6672  }
6673  else if (INFILE(_LT_DUAL_LICENSE_41)) {
6674  MEDINTEREST(lDebug ? "Dual-license(41)" : "Dual-license");
6675  }
6676  else if (INFILE(_LT_DUAL_LICENSE_42)) {
6677  MEDINTEREST(lDebug ? "Dual-license(42)" : "Dual-license");
6678  }
6679  else if (INFILE(_LT_DUAL_LICENSE_43)) {
6680  MEDINTEREST(lDebug ? "Dual-license(43)" : "Dual-license");
6681  }
6682  else if (HASTEXT(_LT_DUAL_LICENSE_44, 0)) {
6683  MEDINTEREST(lDebug ? "Dual-license(44)" : "Dual-license");
6684  }
6685  else if (INFILE(_LT_DUAL_LICENSE_45)) {
6686  MEDINTEREST(lDebug ? "Dual-license(45)" : "Dual-license");
6687  INTERESTING("MIT");
6688  }
6689  else if (HASTEXT(_LT_DUAL_LICENSE_46, REG_EXTENDED)) {
6690  MEDINTEREST(lDebug ? "Dual-license(46)" : "Dual-license");
6691  }
6692  else if (HASTEXT(_LT_DUAL_LICENSE_47, REG_EXTENDED) && NOT_INFILE(_LT_MPL_SECONDARY_LICENSE)) {
6693  MEDINTEREST(lDebug ? "Dual-license(47)" : "Dual-license");
6694  }
6695  else if (INFILE(_LT_DUAL_LICENSE_48)) {
6696  MEDINTEREST(lDebug ? "Dual-license(48)" : "Dual-license");
6697  }
6698  else if (HASTEXT(_LT_DUAL_LICENSE_49, REG_EXTENDED)) {
6699  MEDINTEREST(lDebug ? "Dual-license(49)" : "Dual-license");
6700  }
6702  /*
6703  * The Beer-ware license(!)
6704  */
6705  if (INFILE(_LT_BEERWARE)) {
6706  INTERESTING("Beerware");
6707  }
6709  /*
6710  * CMake license
6711  */
6712  if (URL_INFILE(_URL_CMAKE)) {
6713  INTERESTING("CMake");
6714  }
6716  /*
6717  * unRAR restriction
6718  */
6719  if (INFILE(_LT_UNRARref1) || INFILE(_LT_UNRARref2)) {
6720  INTERESTING("unRAR restriction");
6721  }
6723  /*
6724  * ANTLR Software Rights Notice
6725  */
6726  if (INFILE(_LT_ANTLR)) {
6727  INTERESTING("ANTLR-PD");
6728  lmem[_fANTLR] = 1;
6729  }
6731  /*
6732  * Creative Commons Zero v1.0 Universal
6733  */
6734  if (INFILE(_SPDX_CC0_10)) {
6735  INTERESTING("CC0-1.0");
6736  }
6737  else if (INFILE(_TITLE_CC0_10_1) || INFILE(_PHR_CC0_1) || INFILE(_PHR_CC0_2)) {
6738  INTERESTING("CC0-1.0");
6739  }
6740  else if (INFILE(_SPDX_CC0)) {
6741  INTERESTING("CC0");
6742  }
6744  /*
6745  * PA Font License (IPA)
6746  */
6747  if (INFILE(_TITLE_IPA)) {
6748  INTERESTING("IPA");
6749  }
6751  /*
6752  * European Union Public Licence
6753  */
6754  if (INFILE(_PHR_EUPL_10) || INFILE(_TITLE_EUPL_10)) {
6755  INTERESTING("EUPL-1.0");
6756  }
6757  else if (INFILE(_PHR_EUPL_11) || INFILE(_TITLE_EUPL_11)) {
6758  INTERESTING("EUPL-1.1");
6759  }
6760  else if (INFILE(_TITLE_EUPL_12)) {
6761  INTERESTING("EUPL-1.2");
6762  }
6763  else if (INFILE(_PHR_EUPL)) {
6764  INTERESTING("EUPL");
6765  }
6767  /* University of Illinois/NCSA Open Source License */
6768  if (!lmem[_fNCSA] && INFILE(_TITLE_NCSA) && NOT_INFILE(_TITLE_NCSA_EXHIBIT)) {
6769  INTERESTING(lDebug ? "NCSA(2)" : "NCSA");
6770  /* OZPLB-1.1 refers both to NCSA and OZPLB-1.1 licenses */
6771  if (INFILE(_TITLE_OZPLB_11)) {
6772  INTERESTING("OZPLB-1.1");
6773  }
6774  lmem[_fBSD] = 1;
6775  lmem[_mMIT] = 1;
6776  }
6778  /* ODC Public Domain Dedication & License 1.0 */
6779  if (INFILE(_TITLE_PDDL)) {
6780  INTERESTING("PDDL-1.0");
6781  lmem[_fPDDL] = 1;
6782  }
6784  /* PostgreSQL License */
6785  if (INFILE(_TITLE_POSTGRES) || INFILE(_TITLE_POSTGRES_1)) {
6786  INTERESTING("PostgreSQL");
6787  lmem[_fBSD] = 1;
6788  }
6790  /* Sax Public Domain Notice */
6791  if (INFILE(_LT_SAX_PD)) {
6792  INTERESTING("SAX-PD");
6793  lmem[_fSAX] = 1;
6794  }
6796  /*
6797  * WTF Public "license"
6798  */
6799  if (INFILE(_LT_WTFPL)) {
6800  INTERESTING("WTFPL");
6801  }
6802  else if (INFILE(_LT_WTFPLref)) {
6803  INTERESTING(lDebug ? "WTFPL(ref)" : "WTFPL");
6804  }
6805  else if (INFILE(_LT_WTFPLref_1)) {
6806  INTERESTING(lDebug ? "WTFPL(ref#1)" : "WTFPL");
6807  }
6808  else if (INFILE(_PHR_WTFPL)) {
6809  INTERESTING(lDebug ? "WTFPL(phr)" : "WTFPL");
6810  }
6812  /* Independent JPEG Group License */
6813  if (!lmem[_fIJG]) {
6814  if (HASTEXT(_PHR_IJG_1, REG_EXTENDED)) {
6815  INTERESTING("IJG");
6816  }
6817  else if (HASTEXT(_PHR_IJG_2, 0)) {
6818  INTERESTING("IJG");
6819  }
6820  else if (HASTEXT(_TITLE_IJG_1, 0) && !HASTEXT(_PHR_IJG_INTERFACE_1, 0) && !HASTEXT(_PHR_IJG_INTERFACE_2, 0)) {
6821  INTERESTING("IJG");
6822  }
6823  /* Independent JPEG Group can be referenced without IJG license*/
6824  else if (HASTEXT(_TITLE_IJG_2, 0) && !HASTEXT(_PHR_IJG_INTERFACE_1, 0) && !HASTEXT(_PHR_IJG_INTERFACE_2, 0)) {
6825  INTERESTING("IJG-possibility");
6826  }
6828  }
6829  /* Netizen Open Source License */
6830  if (!lmem[_mMPL] && INFILE(_TITLE_NOSL)) {
6831  INTERESTING(lDebug ? "NOSL(#2)" : "NOSL");
6832  }
6834  /* Net Boolean Public License v1 */
6835  if (INFILE(_TITLE_NBPL_V10)) {
6836  INTERESTING("NBPL-1.0");
6837  }
6839  /* Flora License */
6840  if (INFILE(_TITLE_Flora_V10)) {
6841  INTERESTING("Flora-1.0");
6842  }
6843  else if (INFILE(_TITLE_Flora_V11)) {
6844  INTERESTING("Flora-1.1");
6845  }
6846  else if (URL_INFILE(_URL_Flora)) {
6847  INTERESTING("Flora");
6848  }
6850  /* Standard ML of New Jersey License */
6851  if (INFILE(_TITLE_SMLNJ)) {
6852  INTERESTING("SMLNJ");
6853  }
6855  /* Mozilla Public License possibility */
6856  if (!lmem[_mMPL]) {
6857  if (INFILE(_TEXT_MPLV2) && INFILE(_URL_MPL20)) {
6858  INTERESTING("MPL-2.0");
6859  lmem[_mMPL] = 1;
6860  }
6861  else if (INFILE(_TEXT_MPL20_UNDER)) {
6862  INTERESTING("MPL-2.0");
6863  lmem[_mMPL] = 1;
6864  }
6865  else if (URL_INFILE(_URL_MPL_LATEST)) {
6866  INTERESTING(lDebug ? "MPL(latest)" : "MPL");
6867  lmem[_mMPL] = 1;
6868  }
6869  }
6871  /* Citrix License */
6872  if (INFILE(_TITLE_CITRIX)) {
6873  INTERESTING("Citrix");
6874  lmem[_fCITRIX] = 1;
6875  }
6877  /* CUA office public license */
6878  if (INFILE(_TITLE_CUA10)) {
6879  INTERESTING("CUA-OPL-1.0");
6880  }
6882  /* the Erlang Public License */
6883  if (INFILE(_TITLE_ERLPL_ref)) {
6884  INTERESTING("ErlPL-1.1");
6885  }
6887  /* German Free Software License */
6888  if (INFILE(_TITLE_D_FSL_10) || INFILE(_TITLE_D_FSL_DE1_10) || INFILE(_TITLE_D_FSL_DE2_10) || INFILE(_TITLE_D_FSL_DE3_10) || INFILE(_TITLE_D_FSL_DE4_10))
6889  {
6890  INTERESTING("D-FSL-1.0");
6891  lmem[_mGPL] = 1;
6892  }
6894  /* CCLRC License */
6895  if (INFILE(_TITLE_CCLRC)) {
6896  INTERESTING("CCLRC");
6897  }
6899 
6900  /* Some GPL cases are still missing */
6901  if (!lmem[_mGPL] && (INFILE(_LT_GPL_V2_ref) || INFILE(_LT_GPL_V2_ref1) || INFILE(_LT_GPL_V2_ref2) || INFILE(_LT_GPL_V2_ref3) || INFILE(_LT_GPL_V2_ref4)))
6902  {
6903  INTERESTING(lDebug ? "GPL_V2_ref" : "GPL-2.0-only");
6904  lmem[_mGPL] = 1;
6905  }
6906  else if (!lmem[_mGPL] && INFILE(_LT_GPL_V3_ref))
6907  {
6908  INTERESTING(lDebug ? "GPL_V3_ref" : "GPL-3.0-only");
6909  lmem[_mGPL] = 1;
6910  }
6911  else if (!lmem[_mGPL] && INFILE(_LT_GPLref22))
6912  {
6913  INTERESTING(lDebug ? "GPLref22" : "GPL");
6914  lmem[_mGPL] = 1;
6915  }
6916  else if (!lmem[_mGPL] && NOT_INFILE(_LT_IGNORE_CLAUSE_2) && INFILE(_LT_GPLref21))
6917  {
6918  INTERESTING(lDebug ? "GPLref21" : "GPL");
6919  lmem[_mGPL] = 1;
6920  }
6922 
6923  /* MX4J License version 1.0 */
6924  if (INFILE(_LT_MX4J_V10))
6925  {
6926  INTERESTING("MX4J-1.0");
6927  }
6928  else if (INFILE(_LT_MX4J))
6929  {
6930  INTERESTING("MX4J");
6931  }
6933  /* postfix license */
6934  if (INFILE(_TITLE_POSTFIX))
6935  {
6936  INTERESTING("Postfix");
6937  }
6939  /* not public domain */
6940  if (HASTEXT(_LT_PUBDOM_NOTclaim, REG_EXTENDED)) {
6941  if (INFILE(_LT_PUBDOM_CC)) {
6942  INTERESTING(lDebug ? "Pubdom(CC)" : "CC-PDDC");
6943  pd = 1;
6944  }
6945  else {
6946  INTERESTING(LS_NOT_PD);
6947  pd = 0;
6948  }
6949  }
6951  /* LIBGCJ license */
6952  if (INFILE(_LT_LIBGCJ))
6953  {
6954  INTERESTING("LIBGCJ");
6955  }
6957  /* open cascade technology public license */
6958  if (INFILE(_TITLE_OPEN_CASCADE))
6959  {
6960  INTERESTING("OpenCASCADE-PL");
6961  }
6963  /* KnowledgeTree Public License */
6964  if (INFILE(_LT_KnowledgeTree_V11))
6965  {
6966  INTERESTING("KnowledgeTree-1.1");
6967  }
6969  /* Interbase Public License */
6970  if (INFILE(_LT_Interbase_V10))
6971  {
6972  INTERESTING("Interbase-1.0");
6973  }
6975  /* ClearSilver license */
6976  if (INFILE(_LT_ClearSilver))
6977  {
6978  INTERESTING("ClearSilver");
6979  }
6981  /* ACE, TAO, CIAO */
6982  if(INFILE(_LT_ACE)) {
6983  INTERESTING("ACE");
6984  }
6985  else if(INFILE(_LT_FACE)) {
6986  INTERESTING("FaCE");
6987  }
6989  /* JISP */
6990  if(INFILE(_LT_JISP)) {
6991  INTERESTING("JISP");
6992  }
6994  /* Qmail */
6995  if(INFILE(_LT_QMAIL)) {
6996  INTERESTING("Qmail");
6997  }
6999  /* Migemo */
7000  if(INFILE(_LT_MIGEMO)) {
7001  INTERESTING("Migemo");
7002  }
7004  /* Sendmail */
7005  if(INFILE(_LT_Sendmail_title) ) {
7006  INTERESTING("Sendmail");
7007  }
7009  /* Giftware */
7010  if(INFILE(_LT_GIFTWARE)) {
7011  INTERESTING("Giftware");
7012  }
7014  /* Logica opensource */
7015  if(INFILE(_LT_LOGICA)) {
7016  INTERESTING("Logica-OSL-1.0");
7017  }
7019  /* Unidex */
7020  if(INFILE(_LT_UNIDEX)) {
7021  INTERESTING("Unidex");
7022  }
7024  /* TCL License */
7025  if (!lmem[_fTCL]) {
7026  if (INFILE(_TITLE_TCL)) {
7027  INTERESTING("TCL");
7028  }
7029  else if (INFILE(_SPDX_TCL)) {
7030  INTERESTING("TCL");
7031  }
7032  else if (INFILE(_LT_TCL)) {
7033  INTERESTING("TCL");
7034  }
7035  }
7037  /* AndroidSDK-Commercial license */
7038  if (INFILE(_LT_GOOGLE_SDK)) {
7039  INTERESTING("AndroidSDK.Commercial");
7040  }
7042  /* Qhull license */
7043  if (INFILE(_PHR_Qhull)) {
7044  INTERESTING("Qhull");
7045  }
7047  /* OZPLB-1.0 license */
7048  if (INFILE(_PHR_OZPLB_10)) {
7049  INTERESTING("OZPLB-1.0");
7050  }
7052  /* Texas Instruments license */
7053  if (INFILE(_LT_TI_BASE)) {
7054  if (INFILE(_LT_TI_TSPA)) {
7055  INTERESTING("TI-TSPA");
7056  } else if (INFILE(_LT_TI_TFL)) {
7057  INTERESTING("TI-TFL");
7058  }
7059  }
7061 
7062  /*
7063  * Some licenses say "licensed under the same terms as FOO".
7064  */
7065  gl.flags |= FL_SAVEBASE; /* save match buffer (if any) */
7066  if (*licStr == NULL_CHAR) {
7067  i = 0;
7068  if (INFILE(_LT_SAME_LICENSE_1)) {
7069  INTERESTING(lDebug ? "Same-lic-1" : "Same-license-as");
7070  i = 1;
7071  } else if (INFILE(_LT_SAME_LICENSE_2)) {
7072  INTERESTING(lDebug ? "Same-lic-2" : "Same-license-as");
7073  i = 2;
7074  }
7075  if (i) {
7076  if (cur.licPara == NULL_STR) {
7077  saveLicenseParagraph(cur.matchBase, isML, isPS, NO);
7078  }
7079  }
7080  }
7082  gl.flags |= ~FL_SAVEBASE; /* turn off, regardless */
7083  /*
7084  * ... and, there are several generic claims that "you are free to use this
7085  * software".
7086  * We call these claims "Freeware", because you can use the software free of charge,
7087  * but some other copyright holder exclusive rights are not granted in some cases.
7088  */
7089  if (*licStr == NULL_CHAR || pd >= 0) {
7090  for (i = 0; i < NFREECLAIM; i++) {
7091  if (CANSKIP(i, _KW_permission, _FREE_first_perm,
7092  _FREE_last_perm)) {
7093  i = _FREE_last_perm;
7094  continue;
7095  }
7096  if (CANSKIP(i, _KW_distribut, _FREE_first_dist,
7097  _FREE_last_dist)) {
7098  i = _FREE_last_dist;
7099  continue;
7100  }
7101  if (INFILE(_FREECLAIM_first+i)) {
7102  (void) strcpy(name, "Freeware");
7103  if (lDebug) {
7104  (void) sprintf(name+8, "(%d)", i+1);
7105  }
7106  INTERESTING(name);
7107  break;
7108  }
7109  }
7110  }
7112  /* Check for Public Domain */
7113  if (!lmem[_fANTLR] && !lmem[_fCLA] && !lmem[_mPYTHON] && !lmem[_mGFDL] &&
7114  !lmem[_fODBL] && !lmem[_fPDDL] && !lmem[_fRUBY] && !lmem[_fSAX] && !lmem[_fAPL] && !lmem[_mAPACHE] && !lmem[_mAPACHE10] && !lmem[_mAPACHE11] &&
7115  !lmem[_fARTISTIC] && !lmem[_fCITRIX] && !lmem[_mLGPL] && !lmem[_fBSD]&& NOT_INFILE(_TITLE_D_FSL_10)
7116  && !INFILE(_LT_CPOL)) {
7117  pd = checkPublicDomain(filetext, size, score, kwbm, isML, isPS);
7118  }
7120  /*
7121  * Some licenses point you to files/URLs...
7122  */
7123  if (*licStr == NULL_CHAR) {
7124  checkFileReferences(filetext, size, score, kwbm, isML, isPS);
7125  }
7127  /*
7128  * And, If no other licenses are present but there's a reference to
7129  * something being non-commercial, better note it now.
7130  */
7131 #if 0
7132  if (*licStr == NULL_CHAR && !HASKW(kwbm, _KW_public_domain))
7133 #endif
7134  if (maxInterest != IL_HIGH && !HASKW(kwbm, _KW_public_domain) &&
7135  NOT_INFILE(_PHR_COMMERC_NONCOMM)) {
7136  if (INFILE(_LT_NONCOMMERCIAL_1)) {
7137  INTERESTING(lDebug ? "NonC(1)" : "Non-commercial");
7138  }
7139  else if (INFILE(_LT_ZZNON_COMMERC1)) {
7140  INTERESTING(lDebug ? "NonC(2)" : "Non-commercial");
7141  }
7142  else if (INFILE(_LT_ZZNON_COMMERC2)) {
7143  INTERESTING(lDebug ? "NonC(3)" : "Non-commercial");
7144  }
7145  else if (HASTEXT(_TEXT_COMMERC, 0) &&
7146  INFILE(_PHR_NONCOMMERCIAL)) {
7147  INTERESTING(lDebug ? "NonC(4)" : "Non-commercial");
7148  }
7149  }
7150  if (INFILE(_LT_NOT_OPENSOURCE)) {
7151  INTERESTING("Not-OpenSource");
7152  }
7153  listClear(&whereList, NO); /* again, clear "unused" matches */
7155  /*
7156  * Look for footprints that declare something as proprietary... if we such
7157  * a statement, we care about the Copyright owner, too.
7158  */
7159  if (maxInterest != IL_HIGH) { /* if (*licStr == NULL_CHAR) { */
7160  j = 0; /* just a flag */
7161  if (INFILE(_LT_GEN_PROPRIETARY_1)) {
7162  INTERESTING(lDebug ? "Prop(1)" : "COMMERCIAL");
7163  j++;
7164  }
7165  else if (INFILE(_LT_GEN_PROPRIETARY_2)) {
7166  INTERESTING(lDebug ? "Prop(2)" : "COMMERCIAL");
7167  j++;
7168  }
7169  else if (INFILE(_LT_GEN_PROPRIETARY_3)) {
7170  INTERESTING(lDebug ? "Prop(3)" : "COMMERCIAL");
7171  j++;
7172  }
7173  else if (INFILE(_LT_GEN_PROPRIETARY_4)) {
7174  INTERESTING(lDebug ? "Prop(4)" : "COMMERCIAL");
7175  j++;
7176  }
7177  else if (INFILE(_LT_GEN_PROPRIETARY_5)) {
7178  INTERESTING(lDebug ? "Prop(5)" : "COMMERCIAL");
7179  j++;
7180  }
7181  else if (INFILE(_LT_GEN_PROPRIETARY_6)) {
7182  INTERESTING(lDebug ? "Prop(6)" : "COMMERCIAL");
7183  j++;
7184  }
7185  else if (INFILE(_LT_GEN_PROPRIETARY_7)) {
7186  INTERESTING(lDebug ? "Prop(7)" : "COMMERCIAL");
7187  j++;
7188  }
7189  else if (INFILE(_LT_GEN_PROPRIETARY_8)) {
7190  INTERESTING(lDebug ? "Prop(8)" : "COMMERCIAL");
7191  j++;
7192  }
7193  if (j) {
7194  checkCornerCases(filetext, size, score, kwbm, isML,
7195  isPS, nw, YES);
7196  }
7197  }
7198  listClear(&whereList, NO); /* again, clear "unused" matches */
7200  /*
7201  * END of license-footprint checking of known patterns/strings
7202  ******
7203  * Plan-B: look for things attorneys generally believe aren't "overly
7204  * legally-binding" or "uninterestring from a license perspective':
7205  * ... notable references to commercial, non-commercial, not-for-profit,
7206  * not-an-open-source-license, etc.
7207  */
7208  if (maxInterest != IL_HIGH) {
7209  if (INFILE(_LT_COMMERCIAL_1)) {
7210  INTERESTING(lDebug ? "COMM(1)" : "COMMERCIAL");
7211  }
7212  else if (INFILE(_LT_COMMERCIAL_2)) {
7213  INTERESTING(lDebug ? "COMM(2)" : "COMMERCIAL");
7214  }
7215  else if (HASTEXT(_LT_COMMERCIAL_3, REG_EXTENDED)) {
7216  if (HASTEXT(_LT_COMMERCIAL_Intel, REG_EXTENDED)) {
7217  INTERESTING("Intel.Commercial");
7218  } else if (HASTEXT(_LT_COMMERCIAL_Broadcom, REG_EXTENDED)) {
7219  INTERESTING("Broadcom.Commercial");
7220  } else {
7221  INTERESTING(lDebug ? "COMM(3)" : "COMMERCIAL");
7222  }
7223  }
7224  else if (INFILE(_LT_COMMERCIAL_4)) {
7225  if (HASTEXT(_LT_COMMERCIAL_Android_Fraunhofer, 0)) {
7226  INTERESTING("AndroidFraunhofer.Commercial");
7227  } else {
7228  INTERESTING(lDebug ? "COMM(4)" : "COMMERCIAL");
7229  }
7230  }
7231  else if (HASTEXT(_TEXT_BOOK, 0) && INFILE(_LT_BOOKPURCHASE)) {
7232  INTERESTING(lDebug ? "PurchBook" : "COMMERCIAL");
7233  }
7234  else if (INFILE(_LT_COMMERCIAL_5)) {
7235  INTERESTING(lDebug ? "COMM(5)" : "COMMERCIAL");
7236  }
7237  else if (INFILE(_LT_COMMERCIAL_6)) {
7238  INTERESTING(lDebug ? "COMM(6)" : "COMMERCIAL");
7239  }
7240  else if (INFILE(_LT_COMMERCIAL_7)) {
7241  INTERESTING(lDebug ? "COMM(7)" : "COMMERCIAL");
7242  }
7243  if (INFILE(_LT_NONPROFIT_1)) {
7244  MEDINTEREST(lDebug ? "NonP(1)" : "Non-profit");
7245  }
7246  else if (!lmem[_mPYTH_TEXT] && HASTEXT(_TEXT_PROFIT, 0) &&
7247  INFILE(_PHR_NONPROFIT)) {
7248  if (!(lmem[_fIETF] + lmem[_fDOC])) {
7249  MEDINTEREST(lDebug ? "NonP(2)" : "Non-profit");
7250  }
7251  }
7252  if (INFILE(_PHR_NO_SALE)) {
7253  MEDINTEREST("Not-for-sale");
7254  }
7255  if (!lmem[_mALADDIN] && INFILE(_PHR_NOT_OPEN)) {
7256  MEDINTEREST("NOT-Open-Source");
7257  }
7258  if (HASKW(kwbm, _KW_patent) && INFILE(_PHR_PATENT) && NOT_INFILE(_PHR_PATENT_NOT)) {
7259  MEDINTEREST("Patent-ref");
7260  }
7261  if (INFILE(_PHR_RESTRICT_RIGHTS)) {
7262  if (INFILE(_PHR_USGOVT_RESTRICT)) {
7263  MEDINTEREST("Govt-restrict");
7264  }
7265  else {
7266  MEDINTEREST("Restricted-rights");
7267  }
7268  }
7269  if (INFILE(_LT_EXPORTS_USA)) {
7270  MEDINTEREST("US-Export-restrict");
7271  }
7272  if (pd < 0) {
7273  checkPublicDomain(filetext, size, score, kwbm, isML, isPS);
7274  }
7275  }
7276  listClear(&whereList, NO); /* again, clear "unused" matches */
7278  /*
7279  * These "minimal-reference possibilities" MUST adhere to a prescribed
7280  * format: the name to be used MUST be the first of several name to match:
7281  * "(NAME identifier|NAME license|license NAME)"
7282  *****
7283  * Furthermore, licenses should be ordered from the most-specific to the
7284  * least-specific; e.g., look for LGPL_v3 before looking for LGPL -- the
7285  * strGrep() calls below ensure reporting only more-specific license
7286  * versions if found. For instance, if you order LGPL *before* LGPL_v3
7287  * we'll get both LGPLv3 and LGPL, which is redundant AND looks stupid.
7288  */
7289  if (*licStr == NULL_CHAR && HASKW(kwbm, _KW_license)) {
7290  for (i = 0, j = _MINlicense_first; i < NMINlicense; i++, j++) {
7291  if (dbgIdxGrep(j, filetext, lDiags)) {
7292  cp = strchr(_REGEX(j), ' ');
7293  if (cp == NULL_STR) {
7294  Assert(NO, "Bad reference[1] %d", j);
7295  continue;
7296  }
7297  *cp = NULL_CHAR;
7298  if (!(*licStr) || !strGrep(_REGEX(j)+1, licStr,
7299  REG_ICASE)) {
7300  (void) sprintf(name, "%s-possibility",
7301  _REGEX(j)+1);
7302  LOWINTEREST(name);
7303  }
7304  *cp = ' ';
7305  }
7306  }
7307  }
7308  listClear(&whereList, NO); /* again, clear "unused" matches */
7310  if (*licStr == NULL_CHAR && HASTEXT(_TEXT_SOURCE, 0)) {
7311  for (i = 0, j = _MINsource_first; i < NMINsource; i++, j++) {
7312  if (dbgIdxGrep(j, filetext, lDiags)) {
7313  cp = strchr(_REGEX(j), ' ');
7314  if (cp == NULL_STR) {
7315  Assert(NO, "Bad reference[2] %d", j);
7316  continue;
7317  }
7318  *cp = NULL_CHAR;
7319  if (!(*licStr) || !strGrep(_REGEX(j)+1, licStr,
7320  REG_ICASE)) {
7321  (void) sprintf(name, "%s-possibility",
7322  _REGEX(j)+1);
7323  LOWINTEREST(name);
7324  }
7325  *cp = ' ';
7326  }
7327  }
7328  }
7329  listClear(&whereList, NO); /* again, clear "unused" matches */
7331  if (*licStr == NULL_CHAR && HASTEXT(_KW_copyright, 0)) {
7332  for (i = 0, j = _MINcpyrt_first; i < NMINcpyrt; i++, j++) {
7333  if (dbgIdxGrep(j, filetext, lDiags)) {
7334  cp = strchr(_REGEX(j), ' ');
7335  if (cp == NULL_STR) {
7336  Assert(NO, "Bad reference[2] %d", j);
7337  continue;
7338  }
7339  *cp = NULL_CHAR;
7340  if (!(*licStr) || !strGrep(_REGEX(j)+1, licStr,
7341  REG_ICASE)) {
7342  (void) sprintf(name, "%s-possibility",
7343  _REGEX(j)+1);
7344  LOWINTEREST(name);
7345  }
7346  *cp = ' ';
7347  }
7348  }
7349  }
7350  listClear(&whereList, NO); /* again, clear "unused" matches */
7352  /*
7353  * NOW look for unclassified licenses, if we haven't found anything yet.
7354  * And avoid checking .po files -- message catalogues are known to have
7355  * false-positives.
7356  *****
7357  * FIX-ME: if a file contains ONLY a "no warranty" description/clause, it
7358  * will (currently) get flagged as an UnclassifiedLicense (so the check
7359  * for no-warranty was moved ABOVE this check in case we can use that info)
7360  */
7361  if (maxInterest != IL_HIGH && !lmem[_fDOC]) {
7362  if (!pd &&
7363  checkUnclassified(filetext, size, scp->score, isML,
7364  isPS, nw)) {
7365  strcpy(name, LS_UNCL);
7366  if (isPS) {
7367  strcat(name, "(PS)");
7368  }
7369  MEDINTEREST(name);
7370  checkCornerCases(filetext, size, score, kwbm, isML, isPS, nw, YES);
7371  }
7372 #ifdef UNKNOWN_CHECK_DEBUG
7373  else {
7374  printf("... NOT an Unclassified license, NW %d PD %d\n",
7375  nw, pd);
7376  }
7377 #endif /* UNKNOWN_CHECK_DEBUG */
7378  }
7379  listClear(&whereList, NO); /* clear "unused" matches */
7381  /*
7382  * If we still haven't found anything, check for the really-low interest
7383  * items such as copyrights, and references to keywords (patent/trademark)
7384  */
7385  if (maxInterest != IL_HIGH && pd <= 0) {
7386  checkCornerCases(filetext, size, score, kwbm, isML, isPS,
7387  nw, NO);
7388  }
7389 #ifdef MEMSTATS
7390  printf("DEBUG: static lists in parseLicenses():\n");
7391  listDump(&searchList, -1);
7392  memStats("parseLicenses: pre-Free");
7393 #endif /* MEMSTATS */
7394  listClear(&searchList, NO);
7395 #ifdef MEMSTATS
7396  memStats("parseLicenses: EOP");
7397 #endif /* MEMSTATS */
7398 #ifdef LTSR_DEBUG
7399  showLTCache("LTSR-results AFTER:");
7400 #endif /* LTSR_DEBUG */
7401 #ifdef FLAG_NO_COPYRIGHT
7402  if (!SEEN(_CR_ZZZANY)) {
7403  (void) INFILE(_CR_ZZZANY);
7404  }
7405  if (!SEEN(_CR_ZZZWRONG_1)) {
7406  (void) INFILE(_CR_ZZZWRONG_1);
7407  }
7408  if (LVAL(_CR_ZZZANY)+LVAL(_CR_ZZZWRONG_1)+
7409  HASREGEX(_CR_ZZZWRONG_2, filetext) == 0) {
7410  gl.flags |= FL_NOCOPYRIGHT;
7411  }
7412 #endif /* FLAG_NO_COPYRIGHT */
7413  listClear(&whCacheList, NO);
7414  if (whereList.used) {
7415  listClear(&whereList, NO); /* may already be cleared! */
7416  }
7417  return(licStr+1); /* don't include the leading comma */
7418 }
7419 
7428 char *sisslVersion(char *filetext, int size, int isML, int isPS)
7429 {
7430  char *lstr = NULL_STR;
7431 
7432 #ifdef PROC_TRACE
7433  traceFunc("== sisslVersion()\n");
7434 #endif /* PROC_TRACE */
7435 
7436  if (INFILE(_TITLE_SISSL_V11)) {
7437  lstr = "SISSL-1.1";
7438  }
7439  else if (INFILE(_TITLE_SISSL_V12)) {
7440  lstr = "SISSL-1.2";
7441  } else {
7442  lstr = "SISSL";
7443  }
7444  return lstr;
7445 }
7446 
7455 char *aslVersion(char *filetext, int size, int isML, int isPS)
7456 {
7457  char *lstr = NULL_STR;
7458 
7459 #ifdef PROC_TRACE
7460  traceFunc("== aslVersion()\n");
7461 #endif /* PROC_TRACE */
7462 
7463  /*
7464  * Exclude first non-Apache licenses
7465  */
7466  if (INFILE(_TITLE_PHORUM) || INFILE(_CR_PHORUM)) {
7467  lstr = "Phorum";
7468  lmem[_mAPACHE] = 1;
7469  }
7470  else if (INFILE(_CR_IMAGEMAGICK)) {
7471  lstr = "ImageMagick(Apache)";
7472  lmem[_mAPACHE] = 1;
7473  }
7474  /*
7475  * Apache-2.0 cases
7476  */
7477  else if (INFILE(_SPDX_Apache_20)) {
7478  lstr = (lDebug ? "Apache-2.0(SPDX)" : "Apache-2.0");
7479  lmem[_mAPACHE] = 1;
7480  }
7481  else if (INFILE(_TITLE_Apache_20)) {
7482  lstr = (lDebug ? "Apache-2(f)" : "Apache-2.0");
7483  lmem[_mAPACHE] = 1;
7484  }
7485  else if (INFILE(_PHR_Apache_20_ref1) || INFILE(_PHR_Apache_20_ref2) || INFILE(_PHR_Apache_20_ref3))
7486  {
7487  lstr = (lDebug ? "PHR_Apache_20_ref(1-5)" : "Apache-2.0");
7488  lmem[_mAPACHE] = 1;
7489  }
7490  else if (URL_INFILE(_URL_Apache_20)) {
7491  lstr = (lDebug ? "Apache-2.0(u)" : "Apache-2.0");
7492  lmem[_mAPACHE] = 1;
7493  }
7494  else if (INFILE(_LT_Apache_20) && NOT_INFILE(_TITLE_Flora_V10) && NOT_INFILE(_TITLE_Flora_V11) && !URL_INFILE(_URL_Flora))
7495  {
7496  lstr = (lDebug ? "Apache(2.0#2)" : "Apache-2.0");
7497  lmem[_mAPACHE] = 1;
7498  }
7499  else if (INFILE(_PHR_Apache_20_ref4) || INFILE(_PHR_Apache_20_ref5) || INFILE(_PHR_Apache_20_ref6) || INFILE(_PHR_Apache_20_ref7)) {
7500  lstr = (lDebug ? "Apache(2.0#3)" : "Apache-2.0");
7501  lmem[_mAPACHE] = 1;
7502  }
7503  else if (INFILE(_TITLE_Apache_20)) {
7504  lstr = (lDebug ? "Apache(2.0#4)" : "Apache-2.0");
7505  lmem[_mAPACHE] = 1;
7506  }
7507  else if (URL_INFILE(_URL_Apache_20_1)) {
7508  lstr = (lDebug ? "Apache2(url#1)" : "Apache-2.0");
7509  lmem[_mAPACHE] = 1;
7510  }
7511  else if (URL_INFILE(_URL_Apache_20_2)) {
7512  lstr = (lDebug ? "Apache2(url#2)" : "Apache-2.0");
7513  lmem[_mAPACHE] = 1;
7514  }
7515  /*
7516  * Apache-1.1 cases
7517  */
7518  else if (INFILE(_SPDX_Apache_11)) {
7519  lstr = (lDebug ? "Apache-1.1(SPDX)" : "Apache-1.1");
7520  lmem[_mAPACHE11] = 1;
7521  }
7522  else if (INFILE(_TITLE_Apache_11)) {
7523  lstr = (lDebug ? "Apache-1.1(f)" : "Apache-1.1");
7524  lmem[_mAPACHE11] = 1;
7525  }
7526  else if (URL_INFILE(_URL_Apache_11)) {
7527  lstr = (lDebug ? "Apache-1.1(u)" : "Apache-1.1");
7528  lmem[_mAPACHE11] = 1;
7529  }
7530  else if (INFILE(_LT_Apache_11_CLAUSE_3) && INFILE(_LT_Apache_11_CLAUSE_4) && INFILE(_LT_Apache_11_CLAUSE_5)) {
7531  lstr = (lDebug ? "Apache-1.1(clauses)" : "Apache-1.1");
7532  lmem[_mAPACHE11] = 1;
7533  }
7534  else if (INFILE(_PHR_Apache_11_ref1)) {
7535  lstr = (lDebug ? "Apache(1.1#phr)" : "Apache-1.1");
7536  lmem[_mAPACHE11] = 1;
7537  }
7538  /*
7539  * Apache-1.0 cases
7540  */
7541  else if (INFILE(_SPDX_Apache_10)) {
7542  lstr = (lDebug ? "Apache-1.0(SPDX)" : "Apache-1.0");
7543  lmem[_mAPACHE10] = 1;
7544  }
7545  else if (INFILE(_PHR_Apache_ref2)) {
7546  lstr = (lDebug ? "Apache-1.0(f)" : "Apache-1.0");
7547  lmem[_mAPACHE10] = 1;
7548  }
7549  else if (INFILE(_LT_Apache_10_CLAUSE_4)) {
7550  lstr = (lDebug ? "Apache-1.0(g)" : "Apache-1.0");
7551  lmem[_mAPACHE10] = 1;
7552  }
7553  else if (URL_INFILE(_URL_Apache_10)) {
7554  lstr = (lDebug ? "Apache-1.0(u)" : "Apache-v1.0");
7555  lmem[_mAPACHE10] = 1;
7556  }
7557  /*
7558  * BSD-style cases
7559  */
7560  else if (INFILE(_LT_BSD_1)) {
7561  if (INFILE(_CR_APACHE) || INFILE(_TITLE_Apache)) {
7562  if (INFILE(_PHR_Apache_20_ref6)) {
7563  lstr = (lDebug ? "Apache-20_ref6" : "Apache-2.0");
7564  lmem[_mAPACHE] = 1;
7565  }
7566  else if (INFILE(_PHR_Apache_11_ref2)) {
7567  lstr = (lDebug ? "Apache(1.1#2)" : "Apache-1.1");
7568  lmem[_mAPACHE11] = 1;
7569  }
7570  else if ((INFILE(_PHR_Apache_ref2) || INFILE(_LT_Apache_10_CLAUSE_4))) {
7571  lstr = (lDebug ? "Apache(1.0#2)" : "Apache-1.0");
7572  lmem[_mAPACHE10] = 1;
7573  }
7574  else {
7575  lstr = (lDebug ? "Apache(title)" : "Apache");
7576  lmem[_mAPACHE] = 1;
7577  }
7578  }
7579  }
7580  /*
7581  * Apache without versions
7582  */
7583  else if (!lmem[_fREAL] && INFILE(_SPDX_Apache)) {
7584  lstr = (lDebug ? "Apache(SPDX)" : "Apache");
7585  lmem[_mAPACHE] = 1;
7586  }
7587  else if (INFILE(_PHR_Apache_ref1)) {
7588  INTERESTING(lDebug ? "Apache(ref#1)" : "Apache");
7589  lmem[_mAPACHE] = 1;
7590  }
7591  else if (INFILE(_PHR_Apache_ref4)) {
7592  lstr = (lDebug ? "Apache(ref#3)" : "Apache");
7593  lmem[_mAPACHE] = 1;
7594  }
7595  else if (INFILE(_PHR_Apache_ref3)) {
7596  lstr = (lDebug ? "Apache(ref#4)" : "Apache");
7597  lmem[_mAPACHE] = 1;
7598  }
7599  else if (URL_INFILE(_URL_Apache_1)) {
7600  lstr = (lDebug ? "Apache(url#1)" : "Apache");
7601  lmem[_mAPACHE] = 1;
7602  }
7603  else if (URL_INFILE(_URL_Apache_2)) {
7604  lstr = (lDebug ? "Apache(url#2)" : "Apache");
7605  lmem[_mAPACHE] = 1;
7606  }
7607  else if (INFILE(_PHR_Apache_ref6)) {
7608  lstr = (lDebug ? "Apache(ref#6)" : "Apache");
7609  lmem[_mAPACHE] = 1;
7610  }
7611  /*
7612  * _LT_Apache_1 and _2 cannot be identified in any Apache license
7613  * versions. They have been defined in very early nomos versions. They
7614  * are kept here, although, there are no special test cases for them.
7615  */
7616  else if (INFILE(_LT_Apache_1)) {
7617  lstr = (lDebug ? "Apache(1)" : "Apache");
7618  lmem[_mAPACHE] = 1;
7619  }
7620  else if (INFILE(_LT_Apache_2)) {
7621  lstr = (lDebug ? "Apache(2)" : "Apache");
7622  lmem[_mAPACHE] = 1;
7623  }
7624  else if (INFILE(_LT_APACHESTYLEref)) {
7625  lstr = ("Apache-style");
7626  lmem[_mAPACHE] = 1;
7627  }
7628  return lstr;
7629 }
7630 
7639 char *mplNplVersion(char *filetext, int size, int isML, int isPS)
7640 {
7641  char *lstr = NULL_STR;
7642 
7643 #ifdef PROC_TRACE
7644  traceFunc("== mplNplVersion()\n");
7645 #endif /* PROC_TRACE */
7646 
7647  if (INFILE(_TITLE_MPL11_OR_LATER)) {
7648  lstr = "MPL-1.1+";
7649  }
7650  else if (INFILE(_LT_MPL11_ref)) {
7651  lstr = "MPL-1.1";
7652  }
7653  else if (INFILE(_TITLE_NPL11_MPL)) {
7654  lstr = "NPL-1.1";
7655  }
7656  else if (INFILE(_TITLE_MPL11) && INFILE(_TITLE_MPL_style)) {
7657  lstr = "MPL-1.1-style";
7658  }
7659  else if (INFILE(_TITLE_SUGARCRM_PL)) {
7660  lstr = "SugarCRM-1.1.3";
7661  lmem[_mMPL] = 1;
7662  lmem[_fATTRIB] = 1;
7663  }
7664  else if (INFILE(_TITLE_MPL11) && !HASTEXT(_LT_NP_AME, REG_EXTENDED)) {
7665  lstr = "MPL-1.1";
7666  }
7667  else if (INFILE(_TITLE_MPL20_EXCEPTION)) {
7668  lstr = "MPL-2.0-no-copyleft-exception";
7669  }
7670  else if (INFILE(_TITLE_MPL20) || URL_INFILE(_URL_MPL20) || HASTEXT(_LT_MPL20_ref, REG_EXTENDED)) {
7671  lstr = "MPL-2.0";
7672  }
7673  else if (INFILE(_TITLE_MPL10) && INFILE(_TITLE_ERLPL)) {
7674  lstr = "ErlPL-1.1";
7675  }
7676  else if (INFILE(_TITLE_MPL10)) {
7677  lstr = "MPL-1.0";
7678  }
7679  else if (INFILE(_TITLE_MPL_EULA_30)) {
7680  lstr = "MPL-EULA-3.0";
7681  }
7682  else if (INFILE(_TITLE_MPL_EULA_20)) {
7683  lstr = "MPL-EULA-2.0";
7684  }
7685  else if (INFILE(_TITLE_MPL_EULA_11)) {
7686  lstr = "MPL-EULA-1.1";
7687  }
7688  else if (URL_INFILE(_URL_NPL10)) {
7689  lstr = (lDebug ? "NPL1.0(url)" : "NPL-1.0");
7690  }
7691  else if (URL_INFILE(_URL_NPL11)) {
7692  lstr = (lDebug ? "NPL1.1(url)" : "NPL-1.1");
7693  }
7694  else if (URL_INFILE(_URL_MPL10)) {
7695  lstr = (lDebug ? "MPL1.0(url)" : "MPL-1.0");
7696  }
7697  else if (URL_INFILE(_URL_MPL11)) {
7698  lstr = (lDebug ? "MPL1.1(url)" : "MPL-1.1");
7699  }
7700  else if (INFILE(_FILE_MPL10)) {
7701  lstr = (lDebug ? "MPL1.0(file)" : "MPL-1.0");
7702  }
7703  else if (INFILE(_FILE_MPL11)) {
7704  lstr = (lDebug ? "MPL1.1(file)" : "MPL-1.1");
7705  }
7706  else if (INFILE(_TITLE_NPL11_OR_LATER)) {
7707  lstr = "NPL-1.1+";
7708  }
7709  else if (INFILE(_TITLE_NPL11)) {
7710  lstr = "NPL-1.1";
7711  }
7712  else if (INFILE(_TITLE_NPL10)) {
7713  lstr = "NPL-1.0";
7714  }
7715  else if (URL_INFILE(_URL_NPL)) {
7716  lstr = (lDebug ? "NPL(url)" : "NPL");
7717  }
7718  else if (INFILE(_SPDX_MPL_10)) {
7719  lstr = "MPL-1.0";
7720  }
7721  else if (INFILE(_SPDX_MPL_11)) {
7722  lstr = "MPL-1.1";
7723  }
7724  else if (INFILE(_SPDX_MPL_20_no_copyleft_exception)) {
7725  lstr = "MPL-2.0-no-copyleft-exception";
7726  }
7727  else if (INFILE(_SPDX_MPL_20)) {
7728  lstr = "MPL-2.0";
7729  }
7730  else if (URL_INFILE(_URL_MPL_LATEST)) {
7731  lstr = (lDebug ? "MPL(latest)" : "MPL");
7732  }
7733  else if (URL_INFILE(_URL_MPL)) {
7734  lstr = (lDebug ? "MPL(url)" : "MPL");
7735  }
7736  else if (INFILE(_TITLE_NPL)) {
7737  lstr = "NPL";
7738  }
7739  else if (INFILE(_TITLE_MPL)) {
7740  lstr = "MPL";
7741  }
7742  else {
7743  lstr = (lDebug ? "MPL(last)" : "MPL");
7744  }
7745  return lstr;
7746 }
7747 
7756 char *realVersion(char *filetext, int size, int isML, int isPS, int ref)
7757 {
7758  char *lstr = NULL_STR;
7759 
7760 #ifdef PROC_TRACE
7761  traceFunc("== realVersion()\n");
7762 #endif /* PROC_TRACE */
7763 
7764  if (ref == _TITLE_RPSL) {
7765  if (INFILE(_TITLE_RPSL_V30)) {
7766  lstr = "RPSL-3.0";
7767  }
7768  else if (INFILE(_TITLE_RPSL_V20)) {
7769  lstr = "RPSL-2.0";
7770  }
7771  else if (INFILE(_TITLE_RPSL_V10)) {
7772  lstr = "RPSL-1.0";
7773  }
7774  else if (INFILE(_TITLE_RPSL)) {
7775  lstr = "RPSL";
7776  }
7777  }
7778  else if (ref == _TITLE_RCSL) {
7779  if (INFILE(_TITLE_RCSL_V30)) {
7780  lstr = "RCSL-3.0";
7781  }
7782  else if (INFILE(_TITLE_RCSL_V20)) {
7783  lstr = "RCSL-2.0";
7784  }
7785  else if (INFILE(_TITLE_RCSL_V10)) {
7786  lstr = "RCSL-1.0";
7787  }
7788  else if (INFILE(_TITLE_RCSL)) {
7789  lstr = "RCSL";
7790  }
7791  }
7792  else {
7793  lstr = "RealNetworks-Unknown";
7794  }
7795  return lstr;
7796 }
7797 
7806 char *pythonVersion(char *filetext, int size, int isML, int isPS)
7807 {
7808  char *lstr = NULL_STR;
7809 
7810 #ifdef PROC_TRACE
7811  traceFunc("== pythonVersion()\n");
7812 #endif /* PROC_TRACE */
7813 
7814  if (INFILE(_TITLE_PYTHON201)) {
7815  lstr = "Python-2.0.1";
7816  }
7817  else if (INFILE(_TITLE_PYTHON202)) {
7818  lstr = "Python-2.0.2";
7819  }
7820  else if (INFILE(_TITLE_PYTHON211)) {
7821  lstr = "Python-2.1.1";
7822  }
7823  else if (INFILE(_TITLE_PYTHON213)) {
7824  lstr = "Python-2.1.3";
7825  }
7826  else if (INFILE(_TITLE_PYTHON223)) {
7827  lstr = "Python-2.2.3";
7828  }
7829  else if (INFILE(_TITLE_PYTHON227)) {
7830  lstr = "Python-2.2.7";
7831  }
7832  else if (INFILE(_TITLE_PYTHON237)) {
7833  lstr = "Python-2.3.7";
7834  }
7835  else if (INFILE(_TITLE_PYTHON244)) {
7836  lstr = "Python-2.4.4";
7837  }
7838  else if (INFILE(_TITLE_PYTHON22)) {
7839  lstr = "Python-2.2";
7840  }
7841  else if (INFILE(_TITLE_PYTHON23)) {
7842  lstr = "Python-2.3";
7843  }
7844  else if (INFILE(_TITLE_PYTHON_20_1) || INFILE(_TITLE_PYTHON_20_2)) {
7845  lstr = "Python-2.0";
7846  }
7847  else {
7848  lstr = "Python";
7849  }
7850  return lstr;
7851 }
7852 
7861 char *aflVersion(char *filetext, int size, int isML, int isPS)
7862 {
7863  char *lstr = NULL_STR;
7864 
7865 #ifdef PROC_TRACE
7866  traceFunc("== aflVersion()\n");
7867 #endif /* PROC_TRACE */
7868 
7869  if (INFILE(_TITLE_AFL30)) {
7870  lstr = lDebug? "AFL(v3.0#1)" : "AFL-3.0";
7871  }
7872  else if (INFILE(_TITLE_AFL21)) {
7873  lstr = lDebug? "AFL(v2.1#1)" : "AFL-2.1";
7874  }
7875  else if (INFILE(_TITLE_AFL20)) {
7876  lstr = lDebug? "AFL(v2.0#1)" : "AFL-2.0";
7877  }
7878  else if (INFILE(_TITLE_AFL12)) {
7879  lstr = lDebug? "AFL(v1.2#1)" : "AFL-1.2";
7880  }
7881  else if (INFILE(_TITLE_AFL11)) {
7882  lstr = lDebug? "AFL(v1.1#1)" : "AFL-1.1";
7883  }
7884  else if (INFILE(_TITLE_AFL10)) {
7885  lstr = lDebug? "AFL(v1.0#1)" : "AFL-1.0";
7886  }
7887  else {
7888  lstr = "AFL";
7889  }
7890  return lstr;
7891 }
7892 
7901 char *oslVersion(char *filetext, int size, int isML, int isPS)
7902 {
7903  char *lstr = NULL_STR;
7904  /* */
7905 #ifdef PROC_TRACE
7906  traceFunc("== oslVersion()\n");
7907 #endif /* PROC_TRACE */
7908  /* */
7909  if (INFILE(_TITLE_NON_PROFIT_OSL30)) {
7910  lstr = "NPOSL-3.0";
7911  }
7912  else if (INFILE(_TITLE_OSL30)) {
7913  lstr = lDebug? "OSL(v3.0#1)" : "OSL-3.0";
7914  }
7915  else if (INFILE(_TITLE_OSL21)) {
7916  lstr = lDebug? "OSL(v2.1#1)" : "OSL-2.1";
7917  }
7918  else if (INFILE(_TITLE_OSL20)) {
7919  lstr = lDebug? "OSL(v2.0#1)" : "OSL-2.0";
7920  }
7921  else if (INFILE(_TITLE_OSL11)) {
7922  lstr = lDebug? "OSL(v1.1#1)" : "OSL-1.1";
7923  }
7924  else if (INFILE(_TITLE_OSL10)) {
7925  lstr = lDebug? "OSL(v1.0#1)" : "OSL-1.0";
7926  }
7927  else {
7928  lstr = "OSL";
7929  }
7930  return lstr;
7931 }
7932 
7941 char *cddlVersion(char *filetext, int size, int isML, int isPS)
7942 {
7943  char *lstr = NULL_STR;
7944  /* */
7945 #ifdef PROC_TRACE
7946  traceFunc("== cddlVersion()\n");
7947 #endif /* PROC_TRACE */
7948  /* */
7949  if (INFILE(_TITLE_CDDL_10)) {
7950  lstr = "CDDL-1.0";
7951  }
7952  else if (INFILE(_SPDX_CDDL_10)) {
7953  INTERESTING("CDDL-1.0");
7954  }
7955  else if (URL_INFILE(_URL_CDDL_10)) {
7956  lstr = "CDDL-1.0";
7957  }
7958  else if (INFILE(_TITLE_CDDL_11)) {
7959  lstr = "CDDL-1.1";
7960  }
7961  else if (INFILE(_SPDX_CDDL_11)) {
7962  INTERESTING("CDDL-1.1");
7963  }
7964  else if (URL_INFILE(_URL_CDDL)) {
7965  lstr = "CDDL";
7966  }
7967  else {
7968  lstr = "CDDL";
7969  }
7970  return lstr;
7971 }
7972 
7981 char *lpplVersion(char *filetext, int size, int isML, int isPS)
7982 {
7983  char *lstr = NULL_STR;
7984  /* */
7985 #ifdef PROC_TRACE
7986  traceFunc("== lpplVersion()\n");
7987 #endif /* PROC_TRACE */
7988  /* */
7989  if (INFILE(_PHR_LATEX_PL13A_OR_LATER_1) ||
7990  INFILE(_PHR_LATEX_PL13A_OR_LATER_2)) {
7991  if (INFILE(_LT_LATEX_PREAMBLE)) {
7992  lstr = lDebug ? "LPPL-v1.3a(#1)" : "LPPL-1.3a";
7993  }
7994  else {
7995  lstr = "LPPL-1.3a+";
7996  }
7997  }
7998  else if (INFILE(_TITLE_LATEX_PL13A) || INFILE(_PHR_LATEX_PL13A)) {
7999  lstr = lDebug ? "LPPL-v1.3a(#2)" : "LPPL-1.3a";
8000  }
8001  else if (INFILE(_PHR_LATEX_PL13B_OR_LATER_1) ||
8002  INFILE(_PHR_LATEX_PL13B_OR_LATER_2)) {
8003  if (INFILE(_LT_LATEX_PREAMBLE)) {
8004  lstr = lDebug ? "LPPL-v1.3b(#1)" : "LPPL-1.3b";
8005  }
8006  else {
8007  lstr = "LPPL-1.3b+";
8008  }
8009  }
8010  else if (INFILE(_TITLE_LATEX_PL13B) || INFILE(_PHR_LATEX_PL13B)) {
8011  lstr = lDebug ? "LPPL-v1.3b(#2)" : "LPPL-1.3b";
8012  }
8013  else if (INFILE(_PHR_LATEX_PL13C_OR_LATER_1) ||
8014  INFILE(_PHR_LATEX_PL13C_OR_LATER_2)) {
8015  if (INFILE(_LT_LATEX_PREAMBLE)) {
8016  lstr = lDebug ? "LPPL-v1.3c(#1)" : "LPPL-1.3c";
8017  }
8018  else {
8019  lstr = "LPPL-1.3c+";
8020  }
8021  }
8022  else if (INFILE(_TITLE_LATEX_PL13C) || INFILE(_PHR_LATEX_PL13C)) {
8023  lstr = lDebug ? "LPPL-v1.3c(#2)" : "LPPL-1.3c";
8024  }
8025  else if (INFILE(_PHR_LATEX_PL13_OR_LATER_1) ||
8026  INFILE(_PHR_LATEX_PL13_OR_LATER_2)) {
8027  if (INFILE(_LT_LATEX_PREAMBLE)) {
8028  lstr = lDebug ? "LPPL-v1.3(#1)" : "LPPL-1.3";
8029  }
8030  else {
8031  lstr = "LPPL-1.3+";
8032  }
8033  }
8034  else if (INFILE(_TITLE_LATEX_PL13) || INFILE(_PHR_LATEX_PL13)) {
8035  lstr = lDebug ? "LPPL-v1.3(#2)" : "LPPL-1.3";
8036  }
8037  else if (INFILE(_PHR_LATEX_PL12_OR_LATER_1) ||
8038  INFILE(_PHR_LATEX_PL12_OR_LATER_2)) {
8039  if (INFILE(_LT_LATEX_PREAMBLE)) {
8040  lstr = lDebug ? "LPPL-v1.2(#1)" : "LPPL-1.2";
8041  }
8042  else {
8043  lstr = "LPPL-1.2+";
8044  }
8045  }
8046  else if (INFILE(_TITLE_LATEX_PL12) || INFILE(_PHR_LATEX_PL12)) {
8047  lstr = lDebug ? "LPPL-v1.2(#2)" : "LPPL-1.2";
8048  }
8049  else if (INFILE(_PHR_LATEX_PL11_OR_LATER_1) ||
8050  INFILE(_PHR_LATEX_PL11_OR_LATER_2)) {
8051  if (INFILE(_LT_LATEX_PREAMBLE)) {
8052  lstr = lDebug ? "LPPL-v1.1(#1)" : "LPPL-1.1";
8053  }
8054  else {
8055  lstr = "LPPL-1.1+";
8056  }
8057  }
8058  else if (INFILE(_TITLE_LATEX_PL11) || INFILE(_PHR_LATEX_PL11)) {
8059  lstr = lDebug ? "LPPL-v1.1(#2)" : "LPPL-1.1";
8060  }
8061  else if (INFILE(_PHR_LATEX_PL10_OR_LATER_1) ||
8062  INFILE(_PHR_LATEX_PL10_OR_LATER_2)) {
8063  if (INFILE(_LT_LATEX_PREAMBLE)) {
8064  lstr = lDebug ? "LPPL-v1.0(#1)" : "LPPL-1.0";
8065  }
8066  else {
8067  lstr = "LPPL-1.0+";
8068  }
8069  }
8070  else if (INFILE(_TITLE_LATEX_PL10) || INFILE(_PHR_LATEX_PL10)) {
8071  lstr = lDebug ? "LPPL-v1.0(#2)" : "LPPL-1.0";
8072  }
8073  else {
8074  lstr = "LPPL";
8075  }
8076  return lstr;
8077 }
8078 
8087 char *agplVersion(char *filetext, int size, int isML, int isPS)
8088 {
8089  char *lstr = NULL_STR;
8090  /* */
8091 #ifdef PROC_TRACE
8092  traceFunc("== agplVersion()\n");
8093 #endif /* PROC_TRACE */
8094  /* */
8095  /*
8096  * Look for version 1 BEFORE version 3; the text of version 1 license says
8097  * you can also license it under GPL version 3... same reasoning goes with
8098  * the actual v3 license (vs the reference).
8099  */
8100  if (INFILE(_PHR_AGPL_10_or_later)
8101  || INFILE(_TITLE_AGPL_10_or_later)
8102  || INFILE(_SPDX_AGPL_10_or_later)
8103  || HASTEXT(_SPDX_AGPL_10plus, REG_EXTENDED)
8104  || HASTEXT(_PHR_AGPL_10plus, REG_EXTENDED))
8105  {
8106  lstr = "AGPL-1.0-or-later";
8107  }
8108  else if (INFILE(_PHR_FSF_V1_ONLY)
8109  || INFILE(_TITLE_AGPL_10_only)
8110  || INFILE(_SPDX_AGPL_10))
8111  {
8112  lstr = "AGPL-1.0-only";
8113  }
8114  else if (INFILE(_PHR_AGPL_30_or_later)
8115  || INFILE(_TITLE_AGPL_30_or_later_ref1)
8116  || INFILE(_TITLE_AGPL_30_or_later)
8117  || INFILE(_SPDX_AGPL_30_or_later)
8118  || HASTEXT(_SPDX_AGPL_30plus, REG_EXTENDED)
8119  || HASTEXT(_PHR_AGPL_30plus, REG_EXTENDED))
8120  {
8121  if (INFILE(_LT_AGPL_30)) {
8122  lstr = lDebug ? "Affero-v3(#1)" : "AGPL-3.0-only";
8123  }
8124  else {
8125  lstr = "AGPL-3.0-or-later";
8126  }
8127  }
8128  else if (HASTEXT(_PHR_AGPL_30_1, REG_EXTENDED) || INFILE(_SPDX_AGPL_30)) {
8129  lstr = "AGPL-3.0-only";
8130  }
8131  else if (GPL_INFILE(_PHR_FSF_V3_ONLY)) {
8132  if (INFILE(_TITLE_GPL3)) {
8133  lstr = lDebug ? "GPLv3(Affero#1)" : "GPL-3.0-only";
8134  }
8135  else if (INFILE(_LT_GPL3ref3)){
8136  lstr = lDebug ? "GPLv3(special)" : "GPL-3.0-only";
8137  }
8138  else {
8139  lstr = lDebug ? "Affero-v3(#2)" : "AGPL-3.0-only";
8140  }
8141  }
8142  else if (INFILE(_TITLE_AGPL_30_only)) {
8143  lstr = lDebug ? "Affero-v3(#3)" : "AGPL-3.0-only";
8144  }
8145  else if (INFILE(_TITLE_GPL3)) {
8146  lstr = lDebug ? "GPLv3(Affero#2)" : "GPL-3.0-only";
8147  }
8148  else if (URL_INFILE(_URL_AGPL3)) {
8149  lstr = lDebug ? "Affero-v3(url)" : "AGPL-3.0-only";
8150  }
8151  else {
8152  lstr = "AGPL";
8153  }
8154  return lstr;
8155 }
8156 
8165 char *gfdlVersion(char *filetext, int size, int isML, int isPS)
8166 {
8167  char *lstr = NULL_STR;
8168  /* */
8169 #ifdef PROC_TRACE
8170  traceFunc("== gfdlVersion()\n");
8171 #endif /* PROC_TRACE */
8172  /* */
8173  /*
8174  * Have to be careful here; the text of the 1.2 license says it's licensed
8175  * under 1.1 or later - have to be careful what we're looking for, and in a
8176  * specific order
8177  */
8178  if (INFILE(_TITLE_GFDL_V13_FULL_LICENSE)) {
8179  lstr = "GFDL-1.3";
8180  /* Full GFDL-1.3 license text has a reference to Creative Commons */
8181  if (HASTEXT(_LT_CC_ref, REG_EXTENDED)) {
8182  lmem[_fCCBY] = 1;
8183  }
8184  }
8185  else if (INFILE(_TITLE_GFDL_V13_OR_LATER)) {
8186  lstr = "GFDL-1.3-or-later";
8187  }
8188  else if (INFILE(_TITLE_GFDL_V13_ONLY)) {
8189  lstr = lDebug ? "GFDL-1.3(#1)" : "GFDL-1.3";
8190  }
8191  else if (INFILE(_TITLE_GFDL_V12_FULL_LICENSE)) {
8192  lstr = lDebug ? "GFDL-1.2-only(#1)" : "GFDL-1.2-only";
8193  }
8194  else if (INFILE(_PHR_FSF_V12_OR_LATER) ||
8195  INFILE(_TITLE_GFDL_V12_OR_LATER)) {
8196  lstr = "GFDL-1.2-or-later";
8197  }
8198  else if (INFILE(_TITLE_GFDL_V12_ONLY)) {
8199  lstr = lDebug ? "GFDL-1.2-only(#1)" : "GFDL-1.2-only";
8200  }
8201  else if (INFILE(_TITLE_GFDL_V11_FULL_LICENSE)) {
8202  lstr = lDebug ? "GFDL-1.1-only(#1)" : "GFDL-1.1-only";
8203  }
8204  else if (INFILE(_PHR_FSF_V11_OR_LATER) ||
8205  INFILE(_TITLE_GFDL_V11_OR_LATER)) {
8206  lstr = "GFDL-1.1-or-later";
8207  }
8208  else if (INFILE(_TITLE_GFDL_V11_ONLY)) {
8209  lstr = lDebug ? "GFDL-1.1-only(#1)" : "GFDL-1.1-only";
8210  }
8211  else if (INFILE(_PHR_FSF_V12_ONLY)) {
8212  lstr = lDebug ? "GFDL-1.2-only(#2)" : "GFDL-1.2-only";
8213  }
8214  else if (INFILE(_PHR_FSF_V11_ONLY)) {
8215  lstr = lDebug ? "GFDL-1.1-only(#2)" : "GFDL-1.1-only";
8216  }
8217  else {
8218  lstr = "GFDL";
8219  }
8220  return lstr;
8221 }
8222 
8231 char *lgplVersion(char *filetext, int size, int isML, int isPS)
8232 {
8233  char *lstr = NULL_STR;
8234  /* */
8235 #ifdef PROC_TRACE
8236  traceFunc("== lgplVersion()\n");
8237 #endif /* PROC_TRACE */
8238  /* */
8239  if ((INFILE(_PHR_LGPL21_OR_LATER_1)
8240  || INFILE(_PHR_LGPL21_OR_LATER_2)
8241  || HASTEXT(_PHR_LGPL21_OR_LATER_3, REG_EXTENDED)
8242  || HASTEXT(_PHR_LGPL21_OR_LATER_4, REG_EXTENDED))
8243  && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
8244  {
8245  if (INFILE(_TITLE_LGPL_KDE)) {
8246  lstr = "LGPL-2.1-or-later-KDE-exception";
8247  }
8248  else {
8249  lstr = "LGPL-2.1-or-later";
8250  }
8251  }
8252  else if ((INFILE(_PHR_LGPL3_OR_LATER)
8253  || INFILE(_PHR_LGPL3_OR_LATER_ref1)
8254  || INFILE(_PHR_LGPL3_OR_LATER_ref2)
8255  || HASTEXT(_PHR_LGPL3_OR_LATER_ref3, REG_EXTENDED)
8256  || HASTEXT(_SPDX_LGPL_30plus, REG_EXTENDED)
8257  || HASTEXT(_PHR_LGPL_30plus, REG_EXTENDED))
8258  && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
8259  {
8260  lstr = "LGPL-3.0-or-later";
8261  }
8262  else if (INFILE(_LT_LGPL3ref) && NOT_INFILE(_PHR_NOT_UNDER_LGPL)) {
8263  lstr = "LGPL-3.0-only";
8264  lmem[_mLGPL] = 1;
8265  }
8266  else if (GPL_INFILE(_PHR_LGPL3_ONLY)
8267  || INFILE(_FILE_LGPLv3)
8268  || GPL_INFILE(_PHR_LGPL3_ONLY_ref1)
8269  || GPL_INFILE(_PHR_LGPL3_ONLY_ref2))
8270  {
8271  lstr = "LGPL-3.0-only";
8272  }
8273  else if (INFILE(_PHR_LGPL21_ONLY)
8274  || INFILE(_FILE_LGPLv21)
8275  || URL_INFILE(_URL_LGPL_V21)
8276  || INFILE(_PHR_LGPL21_ONLY_ref)
8277  || INFILE(_PHR_LGPL21_ONLY_ref2)
8278  || INFILE(_PHR_LGPL21_ONLY_ref3)
8279  || INFILE(_PHR_LGPL21_ONLY_ref4))
8280  {
8281  lstr = "LGPL-2.1-only";
8282  }
8283  else if ((INFILE(_PHR_LGPL2_OR_LATER)
8284  || HASTEXT(_PHR_LGPL2_OR_LATER_2, REG_EXTENDED)
8285  || HASTEXT(_PHR_LGPL2_OR_LATER_3, REG_EXTENDED))
8286  && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED))
8287  {
8288  lstr = "LGPL-2.0-or-later";
8289  }
8290  else if (RM_INFILE(_PHR_LGPL2_ONLY) || RM_INFILE(_PHR_LGPL2_ONLY_ref1) || INFILE(_FILE_LGPLv2)) {
8291  lstr = "LGPL-2.0-only";
8292  }
8293  else if (INFILE(_PHR_LGPL1_OR_LATER) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED)) {
8294  lstr = "LGPL-1.0-or-later";
8295  }
8296  else if (INFILE(_PHR_LGPL1_ONLY) || INFILE(_PHR_FSF_V1_ONLY)) {
8297  lstr = "LGPL-1.0-only";
8298  }
8299  else if (URL_INFILE(_URL_CCLGPL_V21)) {
8300  lstr = lDebug ? "CC-LGPL-2.1" : "LGPL-2.1-only";
8301  }
8302  else if (INFILE(_LT_CC_GPL) || INFILE(_TITLE_CC_LGPL)) {
8303  lstr = "CC-LGPL";
8304  }
8305  else if (NY_INFILE(_TEXT_LGPLV3) && NOT_INFILE(_TEXT_LGPLV3_FOOTNOTE) &&
8306  HASREGEX(_TEXT_LGPLV3, filetext)) {
8307  lstr = lDebug ? "LGPL-v3(#2)" : "LGPL-3.0-only";
8308  }
8309  else if (INFILE(_TEXT_LGPLV21) &&
8310  HASREGEX(_TEXT_LGPLV21, filetext)) {
8311  lstr = lDebug ? "LGPL-v2.1(#2)" : "LGPL-2.1-only";
8312  }
8313  else if (INFILE(_TEXT_LGPLV2) &&
8314  HASREGEX(_TEXT_LGPLV2, filetext)) {
8315  lstr = lDebug ? "LGPL-v2(#2)" : "LGPL-2.0-only";
8316  }
8317  else if (INFILE(_SPDX_LGPL_20)) {
8318  lstr = "LGPL-2.0-only";
8319  }
8320  else if (INFILE(_SPDX_LGPL_21)) {
8321  lstr = "LGPL-2.1-only";
8322  }
8323  else if (INFILE(_SPDX_LGPL_30)) {
8324  lstr = "LGPL-3.0-only";
8325  }
8326  else {
8327  lstr = "LGPL";
8328  }
8329  return lstr;
8330 }
8331 
8340 char *gplVersion(char *filetext, int size, int isML, int isPS)
8341 {
8342  char *cp, *lstr = NULL_STR;
8343  /* */
8344 #ifdef PROC_TRACE
8345  traceFunc("== gplVersion()\n");
8346 #endif /* PROC_TRACE */
8347  /* */
8348 
8349  /*
8350  * GPL-3.0-only cases
8351  */
8352  if (GPL_INFILE(_PHR_GPL3_OR_LATER_ref2)
8353  || GPL_INFILE(_PHR_GPL3_OR_LATER_ref3)
8354  || GPL_INFILE(_PHR_GPL3_OR_LATER)
8355  || GPL_INFILE(_PHR_GPL3_OR_LATER_ref1)
8356  || HASTEXT(_SPDX_GPL_30plus, REG_EXTENDED)
8357  || HASTEXT(_PHR_GPL_30plus, REG_EXTENDED))
8358  {
8359  if (!HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED)) {
8360  lstr = "GPL-3.0-or-later";
8361  if (INFILE(_PHR_GPL2_OR_LATER_1)) {
8362  lstr = "GPL-2.0-or-later,GPL-3.0-or-later";
8363  }
8364  }
8365  }
8366  else if (GPL_INFILE(_PHR_FSF_V3_ONLY)
8367  || GPL_INFILE(_PHR_GPL3_ONLY)
8368  || INFILE(_FILE_GPLv3)
8369  || GPL_INFILE(_PHR_GPL3_ONLY_ref1)
8370  || GPL_INFILE(_PHR_GPL3_ONLY_ref2)) {
8371  lstr = lDebug ? "GPL-v3(#2)" : "GPL-3.0-only";
8372  if (INFILE(_PHR_GPL2_OR_LATER_1))
8373  {
8374  lstr = "GPL-2.0-or-later,GPL-3.0-only";
8375  }
8376  }
8377  else if (NY_INFILE(_TEXT_GPLV3) && NOT_INFILE(_TEXT_GPLV3_FOOTNOTE) &&
8378  HASREGEX(_TEXT_GPLV3, filetext)) {
8379  lstr = lDebug ? "GPL-v3(#3)" : "GPL-3.0-only";
8380  }
8381  /*
8382  * GPL-2.0-only cases
8383  */
8384  else if (HASTEXT(_LT_GPL_V2_NAMED_later, REG_EXTENDED) || INFILE(_TITLE_GPL2_ref1_later)) {
8385  lstr = lDebug ? "GPLV2+(named)" : "GPL-2.0-or-later";
8386  }
8387  else if (HASTEXT(_SPDX_GPL_20_or_later, REG_EXTENDED)) {
8388  lstr = lDebug ? "GPL-2.0-or-later(SPDX)" : "GPL-2.0-or-later";
8389  }
8390  else if (INFILE(_PHR_GPL2_OR_LATER_1)) {
8391  if (INFILE(_TITLE_GPL_KDE)) {
8392  lstr = "GPL-2.0-or-laterKDEupgradeClause";
8393  }
8394  else if (INFILE(_PHR_GPL2_ONLY_2) || INFILE(_PHR_GPL2_ONLY_3)) {
8395  lstr = "GPL-2.0-only";
8396  }
8397  else if (!HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED)) {
8398  lstr = lDebug ? "PHR(GPL2_OR_LATER#3)" : "GPL-2.0-or-later";
8399  }
8400  else if (INFILE(_TITLE_GPL2_ref1) || INFILE(_TITLE_GPL2_ref2)) {
8401  lstr = lDebug ? "GPL-2.0-only(title)" : "GPL-2.0-only";
8402  }
8403  }
8404  else if (HASTEXT(_SPDX_GPL_20, REG_EXTENDED)) {
8405  lstr = lDebug ? "GPL-2.0-only(SPDX)" : "GPL-2.0-only";
8406  }
8407  else if (INFILE(_PHR_GPL2_ONLY_4)) {
8408  lstr = "GPL-2.0-only";
8409  }
8410  else if (INFILE(_PHR_GPL2_ONLY_5)) {
8411  lstr = "GPL-2.0-only";
8412  }
8413  else if (GPL_INFILE(_PHR_GPL2_OR_GPL3)) {
8414  lstr = "GPL-2.0-only,GPL-3.0-only";
8415  }
8416  else if (INFILE(_PHR_FSF_V2_ONLY) || INFILE(_PHR_GPL2_ONLY) || INFILE(_PHR_GPL2_ONLY_1) ||
8417  INFILE(_FILE_GPLv2) || INFILE(_LT_GPL_V2_NAMED)) {
8418  lstr = lDebug ? "GPL-v2(#2)" : "GPL-2.0-only";
8419  }
8420  else if (INFILE(_LT_GPL_V2_ref5)) {
8421  lstr = lDebug ? "GPL-2.0-only(ref5)" : "GPL-2.0-only";
8422  }
8423  else if (NY_INFILE(_TEXT_GPLV2)) {
8424  lstr = lDebug ? "GPL-v2(#3)" : "GPL-2.0-only";
8425  }
8426  /*
8427  * GPL-1.0-only cases
8428  */
8429  else if (GPL_INFILE(_PHR_FSF_V1_OR_LATER)
8430  || INFILE(_PHR_GPL1_OR_LATER)
8431  || HASTEXT(_SPDX_GPL_10plus, REG_EXTENDED)
8432  || HASTEXT(_PHR_GPL_10plus, REG_EXTENDED))
8433  {
8434  if (INFILE(_TITLE_GPL1)) {
8435  lstr = lDebug ? "GPL-v1(#1)" : "GPL-1.0-only";
8436  }
8437  else if (!HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED)) {
8438  lstr = "GPL-1.0-or-later";
8439  }
8440  }
8441  else if (INFILE(_PHR_FSF_V1_ONLY) || INFILE(_PHR_GPL1_ONLY)) {
8442  lstr = lDebug ? "GPL-v1(#2)" : "GPL-1.0-only";
8443  }
8444  else if (URL_INFILE(_URL_CCGPL_V2)) {
8445  lstr = "GPL-2.0-only";
8446  }
8447  else if (INFILE(_LT_CC_GPL) || INFILE(_TITLE_CC_GPL)) {
8448  lstr = lDebug ? "GPL(CC_GPL)" : "GPL";
8449  }
8450  else if (NY_INFILE(_TEXT_GPLV1) &&
8451  HASREGEX(_TEXT_GPLV1, filetext)) {
8452  lstr = lDebug ? "GPL-v1(#3)" : "GPL-1.0-only";
8453  }
8454  else if (HASTEXT(_SPDX_GPL_10, REG_EXTENDED)) {
8455  lstr = lDebug ? "GPL-1.0-only(SPDX)" : "GPL-1.0-only";
8456  }
8457  else if (HASTEXT(_SPDX_GPL_30, REG_EXTENDED)) {
8458  lstr = lDebug ? "GPL-3.0-only(SPDX)" : "GPL-3.0-only";
8459  }
8460  /* special case for Debian copyright files
8461  Moved from the beginning here under else if ... is this anymore needed
8462  */
8463  else if (INFILE(_TEXT_GPLV3_CR) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED)) {
8464  lstr = "GPL-3.0-only";
8465  }
8466  else if (INFILE(_FILE_GPL1) || INFILE(_FILE_GPL2)) {
8467  lstr = lDebug ? "GPL(deb)" : "GPL";
8468  }
8469  /*
8470  * MODULE("GPL") cannot be unambiguously interpreted as GPL-2.0-only
8471  * license. Same statement is used also outside Linux kernel.
8472  * Furthermore, many of the files which have this MODULE statement,
8473  * have explicit GPL license statement. Therefore this is changed
8474  * to GPL.
8475  */
8476  else if (INFILE(_TITLE_MODULE_LICENSE_GPL)) {
8477  lstr = lDebug ? "GPL(linux-kernel)" : "GPL";
8478  }
8479  /*
8480  * Finally let's see if there is a type error in license version
8481  */
8482  else if (INFILE(_PHR_GPL21_OR_LATER) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED)) {
8483  lstr = "GPL-2.1+[sic]";
8484  }
8485  else if (INFILE(_PHR_FSF_V21_ONLY) || INFILE(_PHR_GPL21_ONLY)) {
8486  lstr = lDebug ? "GPL-v2.1[sic]" : "GPL-2.1[sic]";
8487  }
8488  /*
8489  * Special case, HACK: "Debian packaging ... licensed under GPL"
8490  *****
8491  * IF we've scanned the regex that might contain it, then kludge.buf != NULL.
8492  * Make darn sure that pointer IS set to NULL before leaving this routine.
8493  */
8494  if (lstr == NULL_STR && kludge.base != NULL_STR) {
8495 #ifdef PHRASE_DEBUG
8496  printf("GPL-META-CHECK: base %p, so %d eo %d\n",
8497  kludge.base, kludge.sso, kludge.seo);
8498 #endif /* PHRASE_DEBUG */
8499  cp = kludge.base + (kludge.sso < 256 ? 0 : kludge.sso-256);
8500  if (HASREGEX(_LT_GPL_META_DEBIAN, cp)) {
8501  lstr = "GPL-Meta";
8502  }
8503  kludge.base = NULL_STR;
8504  }
8505  if (lstr == NULL_STR && NOT_INFILE(_PHR_JYTHON_NOTGPL) && !HASTEXT(_TITLE_QT_GPL_EXCEPTION_10, 0) && !HASTEXT(_LT_OPENBSD_GPL_EXCEPTION, 0)) {
8506  lstr = lDebug ? "GPL(NULL)" : "GPL";
8507  }
8508  return lstr;
8509 }
8510 
8519 char *cplVersion(char *filetext, int size, int isML, int isPS)
8520 {
8521  char *lstr = NULL_STR;
8522  /* */
8523 #ifdef PROC_TRACE
8524  traceFunc("== cplVersion()\n");
8525 #endif /* PROC_TRACE */
8526  /* */
8527  if (INFILE(_TITLE_CPL_10)) {
8528  lstr = "CPL-1.0";
8529  }
8530  else if (URL_INFILE(_URL_CPL_10)) {
8531  lstr = "CPL-1.0";
8532  }
8533  else if (INFILE(_TITLE_CPL_05)) {
8534  lstr = "CPL-0.5";
8535  }
8536  else {
8537  lstr = "CPL";
8538  }
8539  return lstr;
8540 }
8541 
8550 char *ccVersion(char *filetext, int size, int isML, int isPS)
8551 {
8552  char *lstr = NULL_STR;
8553  /* */
8554 #ifdef PROC_TRACE
8555  traceFunc("== ccVersion()\n");
8556 #endif /* PROC_TRACE */
8557  /*
8558  * Creative Commons Attribution-ShareAlike
8559  */
8560  if (INFILE(_TITLE_CC_BY_SA_10) || URL_INFILE(_URL_CC_BY_SA_10)) {
8561  lstr = "CC-BY-SA-1.0";
8562  }
8563  else if (INFILE(_TITLE_CC_BY_SA_20) || URL_INFILE(_URL_CC_BY_SA_20)) {
8564  lstr = "CC-BY-SA-2.0";
8565  }
8566  else if (INFILE(_TITLE_CC_BY_SA_25) || URL_INFILE(_URL_CC_BY_SA_25)) {
8567  lstr = "CC-BY-SA-2.5";
8568  }
8569  else if (INFILE(_TITLE_CC_BY_SA_30) || URL_INFILE(_URL_CC_BY_SA_30)) {
8570  lstr = "CC-BY-SA-3.0";
8571  }
8572  else if (INFILE(_PHR_CC_BY_SA_30)) {
8573  lstr = "CC-BY-SA-3.0";
8574  }
8575  else if (INFILE(_TITLE_CC_BY_SA_40) || URL_INFILE(_URL_CC_BY_SA_40)) {
8576  lstr = "CC-BY-SA-4.0";
8577  }
8578  else if (URL_INFILE(_URL_CC_BY_SA_20)) {
8579  lstr = "CC-BY-SA-2.0";
8580  }
8581  else if (INFILE(_TITLE_CC_BY_SA) || URL_INFILE(_URL_CC_BY_SA)) {
8582  lstr = lDebug ? "CCA-SA(1)" : "CC-BY-SA";
8583  }
8584  /*
8585  * Creative Commons Attribution-NonCommercial-ShareAlike
8586  */
8587  else if (INFILE(_TITLE_CC_BY_NC_SA_40) || URL_INFILE(_URL_CC_BY_NC_SA_40)) {
8588  lstr = "CC-BY-NC-SA-4.0";
8589  }
8590  else if (INFILE(_TITLE_CC_BY_NC_SA_30) || URL_INFILE(_URL_CC_BY_NC_SA_30)) {
8591  lstr = "CC-BY-NC-SA-3.0";
8592  }
8593  else if (INFILE(_TITLE_CC_BY_NC_SA_25) || URL_INFILE(_URL_CC_BY_NC_SA_25)) {
8594  lstr = "CC-BY-NC-SA-2.5";
8595  }
8596  else if (INFILE(_TITLE_CC_BY_NC_SA_20) || URL_INFILE(_URL_CC_BY_NC_SA_20)) {
8597  lstr = "CC-BY-NC-SA-2.0";
8598  }
8599  else if (INFILE(_TITLE_CC_BY_NC_SA_10) || URL_INFILE(_URL_CC_BY_NC_SA_10)) {
8600  lstr = "CC-BY-NC-SA-1.0";
8601  }
8602  /*
8603  * Creative Commons NonCommercial NoDerivs
8604  */
8605  else if (INFILE(_TITLE_CC_BY_NC_ND_40) || URL_INFILE(_URL_CC_BY_NC_ND_40)) {
8606  lstr = "CC-BY-NC-ND-4.0";
8607  }
8608  else if (INFILE(_TITLE_CC_BY_NC_ND_30) || URL_INFILE(_URL_CC_BY_NC_ND_30)) {
8609  lstr = "CC-BY-NC-ND-3.0";
8610  }
8611  else if (INFILE(_TITLE_CC_BY_NC_ND_25) || URL_INFILE(_URL_CC_BY_NC_ND_25)) {
8612  lstr = "CC-BY-NC-ND-2.5";
8613  }
8614  else if (INFILE(_TITLE_CC_BY_NC_ND_20) || URL_INFILE(_URL_CC_BY_NC_ND_20)) {
8615  lstr = "CC-BY-NC-ND-2.0";
8616  }
8617  else if (INFILE(_TITLE_CC_BY_NC_ND_10) || INFILE(_TITLE_CC_BY_NC_ND_10_1) || URL_INFILE(_URL_CC_BY_NC_ND_10)) {
8618  lstr = "CC-BY-NC-ND-1.0";
8619  }
8620  /*
8621  * Creative Commons NonCommercial
8622  */
8623  else if (INFILE(_TITLE_CC_BY_NC_40) || URL_INFILE(_URL_CC_BY_NC_40)) {
8624  lstr = "CC-BY-NC-4.0";
8625  }
8626  else if (INFILE(_TITLE_CC_BY_NC_30) || URL_INFILE(_URL_CC_BY_NC_30)) {
8627  lstr = "CC-BY-NC-3.0";
8628  }
8629  else if (INFILE(_TITLE_CC_BY_NC_25) || URL_INFILE(_URL_CC_BY_NC_25)) {
8630  lstr = "CC-BY-NC-2.5";
8631  }
8632  else if (INFILE(_TITLE_CC_BY_NC_20) || URL_INFILE(_URL_CC_BY_NC_20)) {
8633  lstr = "CC-BY-NC-2.0";
8634  }
8635  else if (INFILE(_TITLE_CC_BY_NC_10) || URL_INFILE(_URL_CC_BY_NC_10)) {
8636  lstr = "CC-BY-NC-1.0";
8637  }
8638  /*
8639  * Creative Commons Attribution-NoDerivatives
8640  */
8641  else if (INFILE(_TITLE_CC_BY_ND_40) || URL_INFILE(_URL_CC_BY_ND_40)) {
8642  lstr = "CC-BY-ND-4.0";
8643  }
8644  else if (INFILE(_TITLE_CC_BY_ND_30) || URL_INFILE(_URL_CC_BY_ND_30)) {
8645  lstr = "CC-BY-ND-3.0";
8646  }
8647  else if (INFILE(_TITLE_CC_BY_ND_25) || URL_INFILE(_URL_CC_BY_ND_25)) {
8648  lstr = "CC-BY-ND-2.5";
8649  }
8650  else if (INFILE(_TITLE_CC_BY_ND_20) || URL_INFILE(_URL_CC_BY_ND_20)) {
8651  lstr = "CC-BY-ND-2.0";
8652  }
8653  else if (INFILE(_TITLE_CC_BY_ND_10) || URL_INFILE(_URL_CC_BY_ND_10)) {
8654  lstr = "CC-BY-ND-1.0";
8655  }
8656  /*
8657  * Creative Commons Attribution
8658  */
8659  else if (INFILE(_TITLE_CC_BY_10) || URL_INFILE(_URL_CC_BY_10)) {
8660  lstr = "CC-BY-1.0";
8661  }
8662  else if (INFILE(_TITLE_CC_BY_20) || URL_INFILE(_URL_CC_BY_20)) {
8663  lstr = "CC-BY-2.0";
8664  }
8665  else if (INFILE(_TITLE_CC_BY_25) || URL_INFILE(_URL_CC_BY_25)) {
8666  lstr = "CC-BY-2.5";
8667  }
8668  else if (INFILE(_TITLE_CC_BY_30) || URL_INFILE(_URL_CC_BY_30)) {
8669  lstr = "CC-BY-3.0";
8670  }
8671  else if (INFILE(_TITLE_CC_BY_40) || URL_INFILE(_URL_CC_BY_40)) {
8672  lstr = "CC-BY-4.0";
8673  }
8674  /*
8675  * Creative Commons CC0
8676  */
8677  else if (INFILE(_TITLE_CC0_10_2)) {
8678  lstr = lDebug ? "CC0(2)" : "CC0-1.0";
8679  }
8680  else if (INFILE(_PHR_CC0_2)) {
8681  lstr = lDebug ? "CC0(2)" : "CC0-1.0";
8682  }
8683  else if (URL_INFILE(_URL_CC0)) {
8684  lstr = lDebug ? "CC0(URL)" : "CC0-1.0";
8685  }
8686  else if (URL_INFILE(_URL_CC_PDDC)) {
8687  lstr = lDebug ? "CC(PD)" : "CC-PDDC";
8688  pd = 1;
8689  }
8690  else if (INFILE(_TITLE_CCPL)) {
8691  INTERESTING("CCPL");
8692  }
8693  else if (INFILE(_TITLE_CC_BY)) {
8694  lstr = lDebug ? "CCA(1)" : "CC-BY";
8695  }
8696  else {
8697  lstr = lDebug ? "CCA(def)" : "CC-BY";
8698  }
8699  lmem[_fCCBY] = 1;
8700  return lstr;
8701 }
8702 
8719 int findPhrase(int index, char *filetext, int size, int isML, int isPS,
8720  int qType)
8721 {
8722  char *ptr = NULL_STR;
8723  char *q = ltsr+index;
8724  char *cp = 0;
8725  int ret;
8726  int i;
8727  int j;
8728  int n;
8729  int wordMatch = 0;
8730  int metaKludge = 0;
8731  int saved = 0;
8732  int sso;
8733  int seo;
8734  item_t *sp;
8735  item_t *op;
8736  list_t *lp;
8737  licText_t *ltp;
8738 #ifdef PARSE_STOPWATCH
8739  DECL_TIMER; /* timer declaration */
8740  char timerName[64];
8741 #endif /* PARSE_STOPWATCH */
8742 
8743 #if defined(PROC_TRACE) || defined(PHRASE_DEBUG) || defined(DOCTOR_DEBUG)
8744  traceFunc("== findPhrase(%d, %p, %d, %d, %d, %d)\n", index, filetext,
8745  size, isML, isPS, qType);
8746  traceFunc("... (regex) \"%s\"\n", _REGEX(index));
8747  traceFunc("... (seed) \"%s\"\n", _SEED(index));
8748 #endif /* PROC_TRACE || PHRASE_DEBUG || DOCTOR_DEBUG */
8749 
8750  ltp = licText + index; /* &licText[index] */
8751  if (ltp->tseed == NULL_STR) {
8752  LOG_FATAL("Regex #%d not suitable for findPhrase()", index)
8753  Bail(-__LINE__);
8754  }
8755  *q |= LTSR_SMASK; /* init: tested, no match */
8756 #ifdef PARSE_STOPWATCH
8757  (void) sprintf(timerName, "findPhrase(%03d): ", index);
8758  START_TIMER;
8759 #endif /* PARSE_STOPWATCH */
8760 #if (DEBUG > 5)
8761  printf("findPhrase: firstword[%d] == \"%s\", used = %d\n", index,
8762  ltp->tseed, searchList.used);
8763 #endif /* DEBUG > 5 */
8764  /*
8765  * See if the first-word of the requested entry has been searched
8766  * previously. The entry we get from listGetItem() refCount (val) field is:
8767  * =0 if this is the first search for this word (non-zero == "seen it"!)
8768  * <0 if the word was NOT FOUND
8769  * >0 if we have doctored-text results cached
8770  */
8771  if ((sp = listGetItem(&searchList, ltp->tseed)) == NULL_ITEM) {
8772  LOG_FATAL("search cache")
8773  Bail(-__LINE__);
8774  }
8775  if (sp->refCount < 0) { /* tseed not found in text */
8776  sp->refCount--;
8777 #ifdef PARSE_STOPWATCH
8778  END_TIMER; /* stop the timer */
8779  (void) strcat(timerName, "Cache-NO - ");
8780  (void) strcat(timerName, ltp->tseed);
8781  PRINT_TIMER(timerName, 0);
8782 #endif /* PARSE_STOPWATCH */
8783  return(0);
8784  }
8785  else if (sp->refCount == 0) { /* e.g., first occurence */
8786 
8787  /*
8788  * Since this is the first search of this word, see if it's in the text.
8789  * NOTE: getInstances() returns a pointer to static (non-allocated) storage
8790  */
8791  if ((cur.nLines) <= 5) {
8792  i = 1;
8793  j = 2;
8794  } else if ((size / cur.nLines) <= 10) {
8795  i = 2;
8796  j = 4;
8797  } else {
8798  i = 3;
8799  j = 6;
8800  }
8801 
8802  /* change to not get record offsets since there is a good sized memory
8803  leak in that code */
8804  //ptr = getInstances(filetext, size, i, j, sp->str, YES);
8805  ptr = getInstances(filetext, size, i, j, sp->str, NO);
8806 
8807  if (ptr == NULL_STR) {
8808  sp->refCount = -1;
8809  /* sp->buf = NULL_STR; */
8810 #ifdef PARSE_STOPWATCH
8811  END_TIMER; /* stop the timer */
8812  (void) strcat(timerName, "tseed-NO - ");
8813  (void) strcat(timerName, ltp->tseed);
8814  PRINT_TIMER(timerName, 0);
8815 #endif /* PARSE_STOPWATCH */
8816  return(0); /* known !match */
8817  }
8818  sp->buf = copyString(ptr, "paragraph");
8819 #ifdef MEMSTATS
8820  printf("... adding %d bytes (search-lookup: \"%s\")\n",
8821  strlen(sp->buf), sp->str);
8822 #endif /* MEMSTATS */
8823  /*
8824  * If the search-seed and regex are the same, we found what we're looking
8825  * for. Else, use doctorBuffer() to strip out punctuation, XML/HTML
8826  * directives, etc.
8827  */
8828 #ifdef PARSE_STOPWATCH
8829  START_TIMER;
8830 #endif /* PARSE_STOPWATCH */
8831 #ifdef DOCTOR_DEBUG
8832  printf(" ... doctoring buffer for \"%s\"\n", sp->str);
8833 #endif /* DOCTOR_DEBUG */
8834  (void) doctorBuffer(sp->buf, isML, isPS, NO);
8835 #ifdef PARSE_STOPWATCH
8836  RESET_TIMER;
8837  (void) sprintf(timerName, "... doctor(%03d): %s (%d)",
8838  index, ltp->tseed, strlen(sp->buf));
8839  PRINT_TIMER(timerName, 0);
8840 #endif /* PARSE_STOPWATCH */
8841  }
8842  sp->refCount++; /* incr ref-count for this seed */
8843  /*
8844  * We need populate the list of "paragraph matches" with offsets in the
8845  * doctored-up buffers; this seems the best place to do it.
8846  */
8847  op = listGetItem(&cur.offList, sp->str);
8848  if (op->nMatch <= 0) {
8849  LOG_FATAL("File-offset list, nMatch(%s): bad entry", sp->str)
8850  Bail(-__LINE__);
8851  }
8852 #if DEBUG>5
8853  printf("matches for key \"%s\": %d\n", sp->str, op->nMatch);
8854 #endif /* DEBUG>5 */
8855  n = strlen(sp->buf);
8856  lp = (list_t *)op->bList;
8857  if ((lp) && (lp->items[0].bDocLen == 0)) {
8858  if (op->nMatch == 1) {
8859  lp->items[0].bDocLen = n;
8860  } else {
8861  ptr = sp->buf;
8862  i = j = 0; /* i is index, j is total offset */
8863  while (strGrep(" xyzzy ", ptr, REG_ICASE)) {
8864  lp->items[i++].bDocLen = j + cur.regm.rm_so;
8865  ptr += cur.regm.rm_eo;
8866  j += (cur.regm.rm_eo + 7); /* strlen(" xyzzy ") */
8867  }
8868  lp->items[i].bDocLen = n + 7; /* last paragraph */
8869  }
8870  }
8871  if (ltp->tseed == ltp->regex) { /* e.g., regex IS seed/key */
8872  wordMatch++;
8873  ret = 1;
8874  } else {
8875  metaKludge = ((qType == 2) && (index == _LT_GPLref1));
8876  if (metaKludge || qType == 4) {
8877  saved = 1;
8878  gl.flags |= FL_SAVEBASE;
8879  }
8880  ret = HASREGEX_RI(index, sp->buf);
8881  if (saved) {
8882  if (ret) {
8883  kludge.base = cur.matchBase;
8884  kludge.sso = cur.regm.rm_so;
8885  kludge.seo = cur.regm.rm_eo;
8886  }
8887  gl.flags &= ~FL_SAVEBASE;
8888  }
8889  }
8890  sso = cur.regm.rm_so; /* do NOT modify this!! */
8891  seo = cur.regm.rm_eo; /* ... or this, either! */
8892  if (ret && !wordMatch) {
8893  *q = LTSR_YES; /* remember this "yes" search result */
8894 
8895  /*
8896  * VERY low-level string-search kludges happen here. This is VERY ugly!!
8897  *****
8898  * If we used idxGrep to search for "GPL" in a "doctored" buffer, we do NOT
8899  * want to match "lesser GPL" or "library GPL" in our searches (it's the
8900  * wrong license name/title). Unfortunately, two aliases for LGPL are
8901  * exactly those above. If we match "GPL" with a wildcard preceeding it, it
8902  * JUST MIGHT BE those words. Rather than perform 2 exclusionary searches
8903  * one for "lesser gpl" and another for "library gpl", look here and if we
8904  * find it, (ugh) KLUDGE the return value to indicate "no match"...
8905  *****
8906  * However, since it's here, it's now extensible. Next search-string kludge
8907  * (that cannot be quickly fixed via changing a regex) should be number 2.
8908  * Just make a new macro (defined above parseLicenses), ala GPL_INFILE().
8909  */
8910  if ((qType > 0) && !wordMatch) {
8911  if ((qType > 4) || (qType < 0)) {
8912  LOG_FATAL("Unknown string-search kludge %d", qType)
8913  Bail(-__LINE__);
8914  }
8915  /*
8916  * Special filter #1: over-write matched text with commas -- this choice is
8917  * significant because doctorBuffer() ensures 'stripped' text has no commas
8918  */
8919  if (qType == 1) { /* destroy text-match */
8920  cp = sp->buf+seo;
8921  ptr = sp->buf+sso;
8922  ltsr[index] = 0; /* reset search cache */
8923  while (ptr <= cp) {
8924  *ptr++ = ',';
8925  }
8926 #ifdef DEBUG
8927  if (lDiags) {
8928  printf("Now, buf %p contains:\n%s\n",
8929  sp->buf, (char *)sp->buf);
8930  }
8931 #endif /* DEBUG */
8932  /*
8933  * Special filter #2: various checks to make sure LGPL/GFDL/GPL license
8934  * references are not confused -- they CAN look quite similar. Specifically
8935  * we don't want to confuse a SINGLE reference to the LGPL as a reference to
8936  * the GPL. BUT -- sometimes references to BOTH are in the same file.
8937  */
8938  }
8939  if ((qType == 2) &&
8940  HASREGEX(_TEXT_LGPL_NOT_GPL, sp->buf+sso) &&
8941  !HASREGEX(_TEXT_GPL_NOT_LGPL, sp->buf+sso) &&
8942  NOT_INFILE(_TEXT_LGPL_DETAILS) &&
8943  NOT_INFILE(_TEXT_LICSET)) {
8944  if (lDiags) {
8945  printf("... \"GPL\" -> LGPL (%d)\n",
8946  index);
8947  }
8948  ltsr[_TEXT_LGPL_NOT_GPL] = LTSR_YES;
8949  ret = 0;
8950  *q = LTSR_NO; /* oops, make that a "no" */
8951  } else if ((qType == 2) &&
8952  HASREGEX(_TEXT_GFDL_NOT_GPL, sp->buf+sso)) {
8953  if (lDiags) {
8954  printf("... \"GPL\" -> GFDL (%d)\n",
8955  index);
8956  }
8957  ltsr[_TEXT_GFDL_NOT_GPL] = LTSR_YES;
8958  ret = 0;
8959  *q = LTSR_NO;
8960  } else if ((index == _LT_GPL3ref) && (qType == 2)) {
8961  if (HASREGEX(_PHR_QEMU_NOT_GPLV3, sp->buf+sso)) {
8962  if (lDiags) {
8963  printf("... \"GPL\" -> QEMU\n");
8964  }
8965  ltsr[_PHR_QEMU_NOT_GPLV3] = LTSR_YES;
8966  ret = 0;
8967  *q = LTSR_NO;
8968  } else if (INFILE(_PHR_SCF_HOWTO)) {
8969  if (lDiags) {
8970  printf("... SCF-Howto\n");
8971  }
8972  ret = 0;
8973  *q = LTSR_NO;
8974  } else if (HASREGEX(_TEXT_DRBD_NOT_GPL3, sp->buf)) {
8975  if (lDiags) {
8976  printf("... mysgl/DRBD\n");
8977  }
8978  ltsr[_TEXT_DRBD_NOT_GPL3] = LTSR_YES;
8979  ret = 0;
8980  *q = LTSR_NO;
8981  }
8982 #ifdef GPLV2_BEATS_GPLV3
8983  else if (strNbuf(sp->buf+sso, "version 2")) {
8984  if (sp->buf + sso + cur.regm.rm_eo <
8985  sp->buf + seo) {
8986  if (lDiags) {
8987  printf("... v%c!\n", *cp);
8988  }
8989  ret = 0;
8990  *q = LTSR_NO;
8991  }
8992  }
8993 #endif /* GPLV2_BEATS_GPLV3 */
8994  } else if ((index == _PHR_GPL3_OR_LATER) &&
8995  (qType == 2) &&
8996  strNbuf(sp->buf+sso, "v2 ")) {
8997  if (lDiags) {
8998  printf("... v2 and version 3\"\n");
8999  }
9000  ret = 0;
9001  *q = LTSR_NO;
9002  } else if ((index == _PHR_GPL3_OR_LATER) &&
9003  (qType == 2) &&
9004  HASREGEX(_TEXT_NOT_GPLV3_DRAFT, sp->buf+sso)) {
9005  if (lDiags) {
9006  printf("... exclude \"GPLv3 draft\"\n");
9007  }
9008  ltsr[_TEXT_NOT_GPLV3_DRAFT] = LTSR_YES;
9009  ret = 0;
9010  *q = LTSR_NO;
9011  } else if ((index == _PHR_GPL3_ONLY) &&
9012  (qType == 2) &&
9013  HASREGEX(_TEXT_NOT_LIBSTDC, sp->buf+sso)) {
9014  if (lDiags) {
9015  printf("... exclude libstdc vers\"\n");
9016  }
9017  ltsr[_TEXT_NOT_LIBSTDC] = LTSR_YES;
9018  ret = 0;
9019  *q = LTSR_NO;
9020  }
9021  /*
9022  * POSIX regex matches the longest string possible, and a '3' can follow a
9023  * "version 2 or later phrase" -- we want to match the '2'. "Vim" has this:
9024  *****
9025  * e) When the GNU General Public License (GPL) applies to the changes,
9026  * you may distribute the modified code under the GNU GPL version 2 or
9027  * any later version.
9028  * 3) A message must be added, at least in the output of the ":version"
9029  * command and in the intro screen, such that the user ...
9030  *****
9031  * So... if there's a NUMBER (!= '3') between the word "version" and the
9032  * end-of-match (at sp->buf+seo), that matches the number AND NOT the 3.
9033  */
9034  else if ((qType == 2) &&
9035  ((index == _PHR_GPL3_ONLY) || (index == _PHR_LGPL3_ONLY))) {
9036  if (strNbuf(sp->buf+sso, "version") ||
9037  strNbuf(sp->buf+sso, "v3")) {
9038  cp = sp->buf + cur.regm.rm_eo;
9039  } else {
9040  cp = sp->buf + seo; /* "nil" loop */
9041  }
9042  for (ptr = sp->buf+seo; cp < ptr; cp++) {
9043  if (isdigit(*cp) && *cp != '3') {
9044  if (lDiags) {
9045  printf("... vers %c!\n",
9046  *cp);
9047  }
9048  ret = 0;
9049  *q = LTSR_NO;
9050  break;
9051  }
9052  }
9053  } else if (index == _PHR_FSF_V3_ONLY && qType == 2) {
9054  if (strNbuf(sp->buf+sso, "version")) {
9055 #ifdef GPLV2_BEATS_GPLV3
9056  ptr = sp->buf + sso + cur.regm.rm_so + 7;
9057 #endif /* GPLV2_BEATS_GPLV3 */
9058  cp = strchr(sp->buf+sso, '3');
9059  if (strncasecmp(cp, "3 tlb", 5) == 0) {
9060  if (lDiags) {
9061  printf("... v3 tlb\n");
9062  }
9063  ret = 0;
9064  *q = LTSR_NO;
9065  }
9066 #ifdef GPLV2_BEATS_GPLV3
9067  else if ((*ptr == ' ') && (*(ptr+1) == '2')) {
9068  if (lDiags) {
9069  printf("... v2, !v3\n");
9070  }
9071  ret = 0;
9072  *q = LTSR_NO;
9073  }
9074 #endif /* GPLV2_BEATS_GPLV3 */
9075  }
9076  else if (strNbuf(sp->buf+sso, "v3")) {
9077  cp = sp->buf + sso + cur.regm.rm_so;
9078  if (strncasecmp(cp-4, "arm ", 4) == 0) {
9079  if (lDiags) {
9080  printf("... arm v3\n");
9081  }
9082  ret = 0;
9083  *q = LTSR_NO;
9084  } else if (strncasecmp(cp, "v3020 ",
9085  6) == 0) {
9086  if (lDiags) {
9087  printf("... v3020\n");
9088  }
9089  ret = 0;
9090  *q = LTSR_NO;
9091  }
9092  }
9093  } else if ((index == _LT_LGPL_OR) &&
9094  (strncasecmp(sp->buf+sso, "or fitness f", 12) == 0)) {
9095  if (lDiags) {
9096  printf("... merch-or-fitness\n");
9097  }
9098  ret = 0;
9099  *q = LTSR_NO;
9100  } else if ((index == _LT_GPLref1) &&
9101  (qType == 2) &&
9102  INFILE(_PHR_LIC_CHANGE)) {
9103  if (lDiags) {
9104  printf("... exclude lic-change\"\n");
9105  }
9106  ret = 0;
9107  *q = LTSR_NO;
9108  } else if ((qType == 2) && (sso > 4)) {
9109  cp = sp->buf+sso-4;
9110  if (strncasecmp(cp, "not ", 4) == 0) {
9111  if (lDiags) {
9112  printf("... NOT l?gpl-ish\n");
9113  }
9114  ret = 0;
9115  *q = LTSR_NO; /* "no" */
9116  }
9117  } else if (qType == 3 && INFILE(_PHR_ARTISTIC_DESC1)) {
9118  /*
9119  Special filter #3: match specific versions of Perl
9120  references, but not all
9121  */
9122  if (lDiags) {
9123  printf("... exclude artistic defn\"\n");
9124  }
9125  ret = 0;
9126  *q = LTSR_NO;
9127  } else if (qType == 4) {
9128  /*
9129  Special filter #4: look for a numerical version
9130  number IFF NOT IN a string of (at least) 4 numerical
9131  characters (signifying a year/datestamp)
9132  */
9133  char *x;
9134  x = cp = cur.matchBase + sso;
9135  ptr = cp - (sso < 100 ? sso : 100);
9136  while (!isdigit(*cp)) {
9137  cp++;
9138  }
9139  if (isdigit(*(cp+1)) && isdigit(*(cp+2)) && isdigit(*(cp+3))) {
9140  if (lDiags) {
9141  printf("... don't want year\n");
9142  }
9143  ret = 0;
9144  *q = LTSR_NO;
9145  } else if (HASREGEX(_TEXT_GNU_HELLO_23, ptr)) {
9146  if (lDiags) {
9147  printf("... gnu example\n");
9148  }
9149  ret = 0;
9150  *q = LTSR_NO;
9151  }
9152 #ifdef GPLV2_BEATS_GPLV3
9153  else if (strncasecmp(x-5, "v2 or ", 5) == 0) {
9154  if (lDiags) {
9155  printf("... v2 or v3\n");
9156  }
9157  ret = 0;
9158  *q = LTSR_NO;
9159  }
9160 #endif /* GPLV2_BEATS_GPLV3 */
9161  /*
9162  * Special case - don't know where better to look for this... other strings
9163  * match TEXT_GPLV3 and should be filtered. This should be a fairly low
9164  * frequency check.
9165  */
9166  else if (index == _TEXT_GPLV3) {
9167  x = cur.matchBase + seo;
9168  if (isdigit(*x) && *x != '0') {
9169  if (lDiags) {
9170  printf("... v3#!0\n");
9171  }
9172  ret = 0;
9173  *q = LTSR_NO;
9174  }
9175  }
9176  }
9177  }
9178 #if (DEBUG > 5)
9179  printf(">>===> \"%s\"\n", ltp->regex);
9180 #endif /* DEBUG > 5 */
9181  }
9182 #ifdef PARSE_STOPWATCH
9183  END_TIMER; /* stop the timer */
9184  (void) sprintf(timerName, "findPhrase(%03d): RET=%d (%s:%d)", index,
9185  ret, ltp->tseed, strlen(sp->buf));
9186  PRINT_TIMER(timerName, 0);
9187 #endif /* PARSE_STOPWATCH */
9188  if (lDiags && ret) {
9189  printRegexMatch(index, NO);
9190  /* locateRegex(filetext, op, index, size, sso, seo); */
9191  }
9192  return(ret);
9193 }
9194 
9209 void locateRegex(char *text, item_t *op, int index, int size, int sso, int seo)
9210 {
9211  int i;
9212  int j;
9213  int n;
9214  int off;
9215  int len;
9216  item_t *sp;
9217  list_t *lp = (list_t *)op->bList;
9218  char *cp;
9219  char *ptr;
9220  char *start;
9221  char save;
9222 
9223 #if defined(PROC_TRACE) || defined(PHRASE_DEBUG)
9224  traceFunc("== locateRegex(%p, %p, %d, %d, %d, %d)\n", text, op, index,
9225  size, sso, seo);
9226 #endif /* PROC_TRACE || PHRASE_DEBUG */
9227 
9228  /*
9229  * First step, simplest case - try to locate the regex in the file. It
9230  * *might* be that easy (but not very often, it turns out).
9231  */
9232  if (idxGrep(index, text, REG_ICASE|REG_EXTENDED)) {
9233  saveRegexLocation(index, cur.regm.rm_so,
9234  cur.regm.rm_eo - cur.regm.rm_so, YES);
9235  return;
9236  }
9237  /*
9238  * Regex is not directly in the raw text file, so now we need to try to
9239  * map a location from a 'doctored buffer' to a location in the original
9240  * text file. Not impossible, yet not overly straight-forward.
9241  */
9242 #ifdef DEBUG
9243  listDump(lp, NO);
9244  printf("Doc-buffer match @ %d:%d\n", sso, seo);
9245  printf("Possible \"%s\" entries to search: %d (%d)\n", op->str,
9246  op->nMatch, lp->used);
9247  for (n = i = 0; (sp=listIterate(lp)); i++) {
9248  printf("Ent[%d]: bDocLen %d (len %d) == file %d+%d (%d)\n",
9249  i, sp->bDocLen, (sp->bDocLen)-n, sp->bStart, sp->bLen,
9250  sp->bStart+sp->bLen);
9251  n = sp->bDocLen;
9252  }
9253 #endif /* DEBUG */
9254  /*
9255  * At this point, the matched phrase should be bounded by {sso} and {seo}
9256  * as offsets within the doctored buffer we're scanning. We also have a
9257  * mapping of offsets within the doctored buffer to more-or-less where it
9258  * exists in the original (raw text) file -- so go find it. Walk through the
9259  * offsets-list; the entry with the LOWEST end-of-doctored-buffer offset
9260  * exceeding the value of 'sso' IS the paragraph where we found the regex.
9261  */
9262  i = -1;
9263  j = -1;
9264  n = 0;
9265  while ((sp = listIterate(lp))) {
9266  if (sso > sp->bDocLen) {
9267  n = sp->bDocLen;
9268  continue;
9269  }
9270  i = sp->bStart;
9271  j = sp->bLen;
9272 #ifdef DEBUG
9273  printf("sso(%d), limit(%d), Possible: @%d+%d\n", sso,
9274  sp->bDocLen, i, j);
9275 #endif /* DEBUG */
9276  listIterationReset(lp);
9277  break;
9278  }
9279  if (i < 0) { /* something is wrong... */
9280  LOG_FATAL("Cannot map reduced-text to raw file contents (#%d)", index)
9281  Bail(-__LINE__);
9282  }
9283  /*
9284  * Remember, the length of text matched in the doctored-buffer will likely
9285  * not match the length of the "same" (unmodified) text in the raw file!
9286  * And, an offset within the doctored buffer CANNOT be any larger than the
9287  * corresponding text segment in the raw file (we only _remove_ characters).
9288  * Next, find the last occurrence (in the raw file) of the last word in
9289  * the license-footprint
9290  */
9291  sso -= n;
9292  seo -= n;
9293  off = i + sso;
9294  len = j - sso;
9295 #ifdef DEBUG
9296  printf("WINDOW-first: offset %d, len %d\n", off, len);
9297 #endif /* DEBUG */
9298  /*printf("BUF: %s\n", sp->buf);*/
9299  start = _REGEX(index);
9300  cp = start + licSpec[index].text.csLen - 1; /* 'end' of regex */
9301 #ifdef DEBUG
9302  printf("EO-Regex, cp == '%c'\n", *cp);
9303 #endif /* DEBUG */
9304  n = 0;
9305  while (*cp == ' ') {
9306  cp--;
9307  }
9308  while ((n == 1) || ((cp != start) && (*cp != ' ') && (*cp != ')') &&
9309  (*cp != '}'))) {
9310  if (*cp == ']') {
9311  n = 1;
9312  } else if (*cp == '[') {
9313  n = 0;
9314  }
9315  if (cp == _REGEX(index)) {
9316  cp = ":no:match";
9317  break;
9318  }
9319  cp--;
9320  }
9321  if (*cp == ')') {
9322  cp--;
9323  n = 1;
9324  while (n) {
9325  if (*cp == '(') {
9326  n--;
9327  } else if (*cp == ')') {
9328  n++;
9329  }
9330  /*printf("'%c' -- n %d\n", *cp, n);*/
9331  if (cp != start) {
9332  cp--;
9333  }
9334  }
9335  while ((cp != start) && (*cp != ' ') && (*cp != '.') && (*cp != ')')
9336  && (*cp != ']') && (*cp != '}')) {
9337  /*printf("skip '%c'...\n", *cp);*/
9338  cp--;
9339  }
9340 #ifdef DEBUG
9341  printf("_END_@%ld '%c'\n", cp-_REGEX(index), *cp);
9342 #endif /* DEBUG */
9343  }
9344  if (cp != start) {
9345  if (*cp != '.') {
9346  cp++;
9347  }
9348  if ((*cp == '?') || (*cp == '+')) {
9349  cp++;
9350  }
9351  }
9352  ptr = sp->buf + sso;
9353  i = j = 0;
9354 #ifdef DEBUG
9355  printf("SEARCH @foot is now \"%s\"\n", cp);
9356 #endif /* DEBUG */
9357  while (strGrep(cp, ptr, REG_ICASE|REG_EXTENDED)) {
9358  i++;
9359  ptr += cur.regm.rm_eo;
9360  j += cur.regm.rm_eo;
9361 #ifdef DEBUG
9362  printf("Found match (%d bytes) @ offset %d (%d tot)\n",
9363  cur.regm.rm_eo - cur.regm.rm_so, cur.regm.rm_so, j);
9364 #endif /* DEBUG */
9365  }
9366 #ifdef DEBUG
9367  printf("Total # of matches == %d\n", i);
9368 #endif /* DEBUG */
9369  if (i && j) {
9370  len = j;
9371 #ifdef DEBUG
9372  printf("WINDOW-adjst: offset %d, len %d\n", off, len);
9373 #endif /* DEBUG */
9374  } else {
9375  Assert(NO, "Regex \"%s\" (foot-end) not in raw text", cp);
9376  }
9377  /*
9378  * Then, find the first occurrence (in the raw file) of the first word
9379  * in the license-footprint; the exception here is that if the "last word"
9380  * turned out to be the entire regex, then the "first word" will be, too.
9381  */
9382  if (cp != start) {
9383  cp = _REGEX(index);
9384  j = 1;
9385 #ifdef DEBUG
9386  printf("BO-Regex, cp == '%c'\n", *cp);
9387 #endif /* DEBUG */
9388  while (*cp == ' ') {
9389  cp++;
9390  }
9391  while (*cp && (*cp != ' ') && (*cp != '.') && (*cp != '(') &&
9392  (*cp != '{')) {
9393  if (*cp == '[') {
9394  if (*(cp + 1) == '^') {
9395  j = 0;
9396  }
9397  while (*cp && (*cp != ']')) {
9398  cp++;
9399  }
9400  if (*(cp+1) && (*(cp+1) == '?')) {
9401  cp++;
9402  }
9403  if (j) {
9404  cp++;
9405  break;
9406  }
9407  }
9408  cp++;
9409  }
9410  if (*cp == '(') {
9411  /*printf("Start@%d '%c'\n", cp-_REGEX(index), *cp);*/
9412  for (n = 1, cp++; n; cp++) {
9413  /*printf("... '%c'\n", *cp);*/
9414  if ((*cp == '(') && (*(cp-1) != '\\')) {
9415  n++;
9416  } else if ((*cp == ')') && (*(cp-1) != '\\')) {
9417  n--;
9418  }
9419  }
9420  while (*cp && (*cp != ' ') && (*cp != '.') && (*cp != '(') &&
9421  (*cp != '[')) {
9422  cp++;
9423  }
9424  /*printf("_END_@%d '%c'\n", cp-_REGEX(index), *cp);*/
9425  }
9426  if ((*cp == '?') ||
9427  (*cp == '+') ||
9428  ((*cp == '.') && (*(cp-1) == '\\'))) {
9429  cp++;
9430  }
9431  if (*cp) {
9432  save = *cp;
9433  *cp = NULL_CHAR;
9434 #ifdef DEBUG
9435  printf("SEARCH @head is now \"%s\"\n", _REGEX(index));
9436 #endif /* DEBUG */
9437  ptr = sp->buf+sso;
9438  if (strGrep(_REGEX(index), ptr,
9439  REG_ICASE|REG_EXTENDED)) {
9440  len -= cur.regm.rm_so;
9441  off += cur.regm.rm_so;
9442  } else {
9443  LOG_NOTICE("Regex \"%s\" (foot-start) not in raw text", _REGEX(index));
9444  }
9445  *cp = save; /* restore to original text */
9446  }
9447 #ifdef DEBUG
9448  else {
9449  LOG_NOTICE("Nothing to trim from the front (*cp == NULL)");
9450  }
9451 #endif /* DEBUG */
9452  }
9453 #ifdef DEBUG
9454  else {
9455  printf("Hey, last-word IS the entire regex!\n");
9456  }
9457 #endif /* DEBUG */
9458  saveRegexLocation(index, off, len, YES);
9459 #ifdef DEBUG
9460  printf("WINDOW-FINAL: offset %d, len %d\n", off, len);
9461 #endif /* DEBUG */
9462  /*
9463  * At this point, the window is as small as we can (reasonably) make it,
9464  * given that we mundged the original file-text and didn't make a complete
9465  * map of every character. The variable off contains the start of the
9466  * window (the absolute offset within the raw file) and the variable len
9467  * contains the length of the text window.
9468  *****
9469  * DON'T FORGET that some license-footprints are determined merely by
9470  * searching for a string in the raw-text file (calling idxGrep()), e.g.,
9471  * not using the doctored buffers. See fileHasPatt() for details.
9472  *****
9473  * And finally, note how the list of entries matched (in 'whereList') is
9474  * manipulated -- see the very bottom of "addRef()".
9475  */
9476  if ((off + len) > size) {
9477  LOG_FATAL("off %d + len %d (== %d) exceeds filesize %d!", off, len, off + len, size);
9478  Bail(-__LINE__);
9479  }
9480  return;
9481 }
9482 
9490 void saveRegexLocation(int index, int offset, int length, int saveCache)
9491 {
9492  item_t *ip;
9493  item_t *sp;
9494 
9495 #if defined(PROC_TRACE) || defined(PHRASE_DEBUG)
9496  traceFunc("== saveRegexLocation(%d, %d, %d, %d)\n", index, offset, length,
9497  saveCache);
9498 #endif /* PROC_TRACE || PHRASE_DEBUG */
9499 
9500  (void) sprintf(name, "reg%04d", index);
9501  sp = listGetItem(&whereList, name);
9502  sp->bIndex = whereList.used;
9503  sp->bStart = offset;
9504  sp->bLen = length;
9505  if (saveCache) {
9506  ip = listGetItem(&whCacheList, name);
9507  ip->bIndex = index;
9508  ip->bStart = offset;
9509  ip->bLen = length;
9510  }
9511  return;
9512 }
9513 
9514 
9515 void saveUnclBufLocation(int bufNum)
9516 {
9517  item_t *p;
9518  item_t *bp;
9519  list_t *lp;
9520 
9521 #if defined(PROC_TRACE) || defined(PHRASE_DEBUG)
9522  traceFunc("== saveUnclBufLocation(%d, %d, %d, %d)\n", bufNum);
9523 #endif /* PROC_TRACE || PHRASE_DEBUG */
9524 
9525  listClear(&whereList, NO); /* empty all prior matches */
9526  p = listGetItem(&cur.offList, _REGEX(_LEGAL_first));
9527  lp = (list_t *) p->bList;
9528  (void) sprintf(name, "buf%05d", bufNum);
9529  p = listGetItem(lp, name);
9530  bp = listGetItem(&whereList, LS_UNCL);
9531  bp->bStart = p->bStart;
9532  bp->bLen = p->bLen;
9533  bp->bIndex = -1;
9534  return;
9535 }
9536 
9542 void addRef(char *str, int interest)
9543 {
9544  item_t *p;
9545  char *bp;
9546  char *sp = str;
9547  if(!(str && str[0]))
9548  return;
9549 
9550 #ifdef PROC_TRACE
9551  traceFunc("== addRef(\"%s\", %d)\n", str, interest);
9552 #endif /* PROC_TRACE */
9553 
9554 #if defined(DEBUG)
9555  listDump(&whereList, YES);
9556 #endif /* DEBUG */
9557  /*
9558  * Add this to the list of individual pieces found, and mark the license
9559  * to make generating a license-summary easier. The general strategy is
9560  * to COMPLETELY ignore anything NOT considered 'noteworthy'. So if the
9561  * license is noteworthy, we add one to the count, so that we can call
9562  * listCount() on the list to find if there's a 'real license' in here.
9563  * see makeLicenseSummary() in license.c for more details.
9564  *****
9565  * This little trick is also used in distroReport() and rawSourceReport(),
9566  * see report.c
9567  */
9568  if (str == NULL_STR) {
9569  Assert(YES, "license detected != NULL");
9570  }
9571  if (*str == NULL_CHAR) {
9572  Assert(YES, "license string not start with NULL");
9573  }
9574  bp = licStr+refOffset;
9575  *bp++ = ',';
9576  /*
9577  CDB - Opportunity for optimization via memcpy
9578  */
9579  while (*sp) {
9580  *bp++ = *sp++;
9581  }
9582  *bp = NULL_CHAR;
9583  refOffset = bp - licStr;
9584  /*
9585  * Stuff this license in to several lists:
9586  * - parseList is used to create a package "computed license summary"
9587  * - briefList is used to compute a "terse/brief" license summary
9588  */
9589  p = listGetItem(&cur.parseList, str);
9590  if (interest) {
9591  p->iFlag++;
9592  if (interest > IL_LOW) {
9593  p->iLevel = interest;
9594  }
9595  }
9596  if (interest > maxInterest) {
9597  maxInterest = interest;
9598  }
9599  if (lDiags && whereList.used) {
9600  int i = 0;
9601  listSort(&whereList, SORT_BY_COUNT_ASC);
9602  printf("WINDOW for \"%s\": ", str);
9603  while ((p = listIterate(&whereList))) {
9604  if (i++ > 0) {
9605  printf(", ");
9606  }
9607  printf("%d+%d", p->bStart, p->bLen);
9608  }
9609  printf("\n");
9610  }
9611  listClear(&whereList, NO);
9612 #ifdef DEBUG
9613  if (lDiags) {
9614  printf("++ \"%s\" [int=%d]\n", str, interest);
9615  }
9616 #endif /* DEBUG */
9617 
9618  addLicence(cur.theMatches,str);
9619 
9620  return;
9621 }
9622 
9628 int famOPENLDAP(char *filetext, int size, int isML, int isPS)
9629 {
9630  int ret = 0;
9631 
9632  if (lmem[_tOPENLDAP]) {
9633  if (INFILE(_TITLE_OPENLDAP25)) {
9634  INTERESTING("OLDAP-2.5");
9635  ret = 1;
9636  }
9637  else if (INFILE(_TITLE_OPENLDAP26)) {
9638  INTERESTING("OLDAP-2.6");
9639  ret = 1;
9640  }
9641  else if (INFILE(_TITLE_OPENLDAP27)) {
9642  INTERESTING("OLDAP-2.7");
9643  ret = 1;
9644  }
9645  else if (INFILE(_TITLE_OPENLDAP28)) {
9646  INTERESTING("OLDAP-2.8");
9647  ret = 1;
9648  }
9649  else if (INFILE(_TITLE_OPENLDAP201)) {
9650  INTERESTING("OLDAP-2.0.1");
9651  ret = 1;
9652  }
9653  else if (INFILE(_TITLE_OPENLDAP20)) {
9654  INTERESTING("OLDAP-2.0");
9655  ret = 1;
9656  }
9657  else if (INFILE(_TITLE_OPENLDAP21)) {
9658  INTERESTING("OLDAP-2.1");
9659  ret = 1;
9660  }
9661  else if (INFILE(_TITLE_OPENLDAP221) || INFILE(_SPDX_OLDAP_221)) {
9662  INTERESTING("OLDAP-2.2.1");
9663  ret = 1;
9664  }
9665  else if (INFILE(_TITLE_OPENLDAP222) || INFILE(_SPDX_OLDAP_222)) {
9666  INTERESTING("OLDAP-2.2.2");
9667  ret = 1;
9668  }
9669  else if (INFILE(_TITLE_OPENLDAP22)) {
9670  INTERESTING("OLDAP-2.2");
9671  ret = 1;
9672  }
9673  else if (INFILE(_TITLE_OPENLDAP11)) {
9674  INTERESTING("OLDAP-1.1");
9675  ret = 1;
9676  }
9677  else if (INFILE(_TITLE_OPENLDAP23)) {
9678  INTERESTING("OLDAP-2.3");
9679  ret = 1;
9680  }
9681  else if (INFILE(_TITLE_OPENLDAP24)) {
9682  INTERESTING("OLDAP-2.4");
9683  ret = 1;
9684  }
9685  else if (INFILE(_TITLE_OPENLDAP12)) {
9686  INTERESTING("OLDAP-1.2");
9687  ret = 1;
9688  }
9689  else if (INFILE(_TITLE_OPENLDAP13)) {
9690  INTERESTING("OLDAP-1.3");
9691  ret = 1;
9692  }
9693  else if (INFILE(_TITLE_OPENLDAP14)) {
9694  INTERESTING("OLDAP-1.4");
9695  ret = 1;
9696  }
9697  else if (INFILE(_CR_OPENLDAP) && INFILE(_TITLE_OPENLDAP)) {
9698  INTERESTING("OLDAP");
9699  ret = 1;
9700  }
9701  }
9702  lmem[_fOPENLDAP] = ret;
9703  return(ret);
9704 }
9705 
9706 
9730 int checkUnclassified(char *filetext, int size, int score,
9731  int isML, int isPS, int nw)
9732 {
9733  char *buf;
9734  char *curptr;
9735  char *cp;
9736  int m = 0;
9737 #ifdef UNKNOWN_CHECK_DEBUG
9738  int pNum = 0;
9739 #endif /* UNKNOWN_CHECK_DEBUG */
9740  int i = 0;
9741 
9742 #ifdef PROC_TRACE
9743  traceFunc("== checkUnclassified(%p, %d, %d, %d, %d, %d)\n", filetext,
9744  size, score, isML, isPS, nw);
9745 #endif /* PROC_TRACE */
9746 
9747  /*
9748  * Based on experience, this is a good place to look for false-positives:
9749  *****
9750  * Occasionally IETF documents (RFCs, technical descriptions and the like)
9751  * have enough text to trip the unclassified-license detector falsely.
9752  * As a first quick check, see if there's an IETF copyright in the file
9753  * and if so, avoid this (somewhat expensive) check.
9754  *****
9755  * The "Debian social contract" has some very legal-looking verbage, too.
9756  */
9757  if (mCR_IETF()) {
9758  return(0);
9759  }
9760  if (INFILE(_LT_DEB_CONTRACT) || INFILE(_LT_DEB_CONTRACTref)){
9761  INTERESTING("Debian-social-DFSG");
9762  return(0);
9763  }
9764  if (INFILE(_LT_TROLLTECH)) {
9765  return(1);
9766  }
9767 
9768  /*
9769  * A Generic EULA 'qualifies' as an UnclassifiedLicense, or the clause 'License agreement' as an UnclassifiedLicense, check this
9770  * one before trying the word-matching magic checks (below).
9771  */
9772  gl.flags |= FL_SAVEBASE; /* save match buffer (if any) */
9773  m = INFILE(_LT_GEN_EULA) || INFILE(_LT_LG) || INFILE(_LT_GENERIC_UNCLASSIFIED);
9774  /* gl.flags & ~FL_SAVEBASE; CDB -- This makes no sense, given line above */
9775  if (m) {
9776  if (cur.licPara == NULL_STR && cur.matchBase) {
9777  saveLicenseParagraph(cur.matchBase, isML, isPS, NO);
9778  }
9779  return(1);
9780  }
9781  checknw = nw;
9782  /*
9783  * Look for paragraphs of text that could be licenses. We'll check the
9784  * resulting text for 4 types of different words (all in proximity leads
9785  * us to believe it's a license of some sort). If we don't get a paragraph
9786  * to search based on the first set of words, look no further.
9787  */
9788 #ifdef UNKNOWN_CHECK_DEBUG
9789  printf("... first regex: \"%s\"\n", _REGEX(_LEGAL_first));
9790 #endif /* UNKNOWN_CHECK_DEBUG */
9791  if ((buf = getInstances(filetext, size, gl.uPsize, gl.uPsize,
9792  _REGEX(_LEGAL_first), YES)) == NULL_STR) {
9793 #ifdef UNKNOWN_CHECK_DEBUG
9794  printf("... getInstances returns NULL\n");
9795 #endif /* UNKNOWN_CHECK_DEBUG */
9796  return(0);
9797  }
9798  if (lDiags) {
9799  printRegexMatch(_LEGAL_first, NO);
9800  }
9801  /*
9802  * Without examining each paragraph, make sure the file contains the
9803  * components we're looking for... if not, don't check any further.
9804  */
9805  if (/*size > 102400 && */
9806  !match3(_LEGAL_first, buf, score, NO, isML, isPS)) {
9807 #ifdef UNKNOWN_CHECK_DEBUG
9808  printf("... first check fails\n");
9809 #endif /* UNKNOWN_CHECK_DEBUG */
9810  return(0);
9811  }
9812  /*
9813  * buf now points to a series of paragraphs that have 6 lines above
9814  * AND below the regex we've matched, PLUS a separator line between
9815  * each paragraph. The LAST paragraph doesn't have a separator-line.
9816  *****
9817  * For the sake of the search, make the separator line 'disappear'.
9818  */
9819  curptr = buf;
9820  while (idxGrep(_UTIL_XYZZY, curptr, 0)) {
9821  cp = curptr + cur.regm.rm_so;
9822  *cp = NULL_CHAR;
9823 #ifdef UNKNOWN_CHECK_DEBUG
9824  printf("DEBUG: paragraph #%d:\n[START-PARA]\n%s\n[END-PARA]\n",
9825  ++pNum, curptr);
9826 #endif /* UNKNOWN_CHECK_DEBUG */
9827  i++;
9828  /*
9829  * Now that we have our 'paragraph span', check the contents of the
9830  * paragraph for the other 3 groups of words. A match in EACH group
9831  * (plus other criteria checked, of course) means we've likely found
9832  * as-of-yet unclassified license.
9833  *****
9834  * A generic "no warranty" paragraph also looks like a license, so in
9835  * that case don't return a false positive.
9836  */
9837  if (match3(_LEGAL_first, curptr, score, YES, isML, isPS)) {
9838  saveUnclBufLocation(i);
9839  return(1);
9840  }
9841 #ifdef UNKNOWN_CHECK_DEBUG
9842  else {
9843  printf("DEBUG: match() returns 0, look again\n");
9844  }
9845 #endif /* UNKNOWN_CHECK_DEBUG */
9846  /*
9847  * NO-match means this paragraph doesn't contain the magic words we
9848  * seek. However, this file still _may_ contain the magic paragraph --
9849  * it'll be searched in this while-loop until either the magic OR
9850  * end-of-file is found)...
9851  */
9852  *cp++ = '='; /* reset line */
9853  if ((cp = findEol(cp)) == NULL_STR) {
9854  LOG_FATAL("Cannot find delimeter!")
9855  Bail(-__LINE__);
9856  }
9857  curptr = cp+1;
9858  }
9859  /*
9860  * One last buffer to try...
9861  */
9862 #ifdef UNKNOWN_CHECK_DEBUG
9863  printf("DEBUG: %s paragraph (#%d):\n[START-PARA]\n%s\n[END-PARA]\n",
9864  pNum == 0 ? "ONLY" : "LAST", ++pNum, curptr);
9865 #endif /* UNKNOWN_CHECK_DEBUG */
9866  if (match3(_LEGAL_first, curptr, score, YES, isML, isPS)) {
9867  saveUnclBufLocation(++i);
9868  return(1);
9869  }
9870  return(0);
9871 }
9872 
9873 
9877 void checkFileReferences(char *filetext, int size, int score, int kwbm,
9878  int isML, int isPS)
9879 {
9880  int i;
9881 
9882 #ifdef PROC_TRACE
9883  traceFunc("== checkFileReferences(%p, %d, %d, 0x%x, %d, %d)\n", filetext,
9884  size, score, kwbm, isML, isPS);
9885 #endif /* PROC_TRACE */
9886  for (i = 0; i < NSEECOPYING; i++) {
9887  if (INFILE(_SEECOPYING_first+i)) {
9888  if (lDebug) {
9889  (void) sprintf(name, "Gen-CPY-%d", ++i);
9890  INTERESTING(name);
9891  } else {
9892  INTERESTING("See-file.COPYING");
9893  }
9894  return;
9895  }
9896  }
9897  /* */
9898  for (i = 0; i < NSEELICENSE; i++) {
9899  if (INFILE(_SEELICENSE_first+i)) {
9900  if (lDebug) {
9901  (void) sprintf(name, "Gen-CPY-%d", ++i);
9902  INTERESTING(name);
9903  } else {
9904  INTERESTING("See-file.LICENSE");
9905  }
9906  return;
9907  }
9908  }
9909  /* */
9910  for (i = 0; i < NSEEREADME; i++) {
9911  if (INFILE(_SEEREADME_first+i)) {
9912  if (lDebug) {
9913  (void) sprintf(name, "Gen-CPY-%d", ++i);
9914  INTERESTING(name);
9915  } else {
9916  INTERESTING("See-file.README");
9917  }
9918  return;
9919  }
9920  }
9921  /* */
9922  for (i = 0; i < NSEEOTHER; i++) {
9923  if (INFILE(_SEEOTHER_first+i)) {
9924  if (lDebug) {
9925  (void) sprintf(name, "Gen-CPY-%d", ++i);
9926  INTERESTING(name);
9927  } else {
9928  INTERESTING("See-doc.OTHER");
9929  }
9930  return;
9931  }
9932  }
9933  /* */
9934  if (INFILE(_LT_SEE_OUTPUT_1)) {
9935  INTERESTING(lDebug ? "Gen-EXC-1" : "GNU-style.EXECUTE");
9936  }
9937 #if 0
9938  else if (INFILE(_LT_SEE_OUTPUT_2)) {
9939  INTERESTING(lDebug ? "Gen-EXC-2" : "Free-SW.run-COMMAND");
9940  } else if (INFILE(_LT_SEE_OUTPUT_3)) {
9941  INTERESTING(lDebug ? "Gen-EXC-3" : "Free-SW.run-COMMAND");
9942  }
9943 #endif
9944  if(HASTEXT(_LT_SEE_COPYING_LICENSE_1, REG_EXTENDED) || HASTEXT(_LT_SEE_COPYING_LICENSE_2, REG_EXTENDED)) {
9945  INTERESTING("See-file");
9946  }
9947  else if (HASTEXT(_LT_SEE_URL, REG_EXTENDED) || HASTEXT(_LT_SEE_URL_ref1, REG_EXTENDED) || HASTEXT(_LT_SEE_URL_ref2, REG_EXTENDED) || HASTEXT(_LT_SEE_URL_ref3, REG_EXTENDED)) {
9948  INTERESTING("See-URL");
9949  }
9950  return;
9951 
9952 #ifdef OLD_VERSION
9953  if (INFILE(_LT_SEE_COPYING_1)) {
9954  INTERESTING(lDebug ? "Gen-CPY-1" : "See-file.COPYING");
9955  }
9956  else if (INFILE(_LT_SEE_COPYING_2)) {
9957  INTERESTING(lDebug ? "Gen-CPY-2" : "See-file.COPYING");
9958  }
9959  else if (INFILE(_LT_SEE_COPYING_3)) {
9960  INTERESTING(lDebug ? "Gen-CPY-3" : "See-file.COPYING");
9961  }
9962  else if (INFILE(_LT_SEE_COPYING_4)) {
9963  INTERESTING(lDebug ? "Gen-CPY-4" : "See-file.COPYING");
9964  }
9965  else if (INFILE(_LT_SEE_COPYING_5)) {
9966  INTERESTING(lDebug ? "Gen-CPY-5" : "See-file.COPYING");
9967  }
9968  else if (INFILE(_LT_SEE_COPYING_6)) {
9969  INTERESTING(lDebug ? "Gen-CPY-6" : "See-file.COPYING");
9970  }
9971  else if (INFILE(_LT_SEE_COPYING_7)) {
9972  INTERESTING(lDebug ? "Gen-CPY-7" : "See-file.COPYING");
9973  }
9974  else if (INFILE(_LT_SEE_COPYING_8)) {
9975  INTERESTING(lDebug ? "Gen-CPY-8" : "See-file.COPYING");
9976  }
9977  else if (INFILE(_LT_SEE_COPYING_9)) {
9978  INTERESTING(lDebug ? "Gen-CPY-9" : "See-file.COPYING");
9979  }
9980  else if (INFILE(_LT_SEE_COPYING_10)) {
9981  INTERESTING(lDebug ? "Gen-CPY-10" : "See-file.COPYING");
9982  }
9983  else if (INFILE(_LT_SEE_COPYING_LAST1)) {
9984  INTERESTING(lDebug ? "Gen-CPY-L1" : "See-file.COPYING");
9985  }
9986  else if (INFILE(_LT_SEE_COPYING_LAST2)) {
9987  INTERESTING(lDebug ? "Gen-CPY-L2" : "See-file.COPYING");
9988  }
9989  else if (INFILE(_LT_SEE_LICENSE_1)) {
9990  INTERESTING(lDebug ? "Gen-LIC-1" : "See-file.LICENSE");
9991  }
9992  else if (INFILE(_LT_SEE_LICENSE_2)) {
9993  INTERESTING(lDebug ? "Gen-LIC-2" : "See-file.LICENSE");
9994  }
9995  else if (INFILE(_LT_SEE_LICENSE_3)) {
9996  INTERESTING(lDebug ? "Gen-LIC-3" : "See-file.LICENSE");
9997  }
9998  else if (INFILE(_LT_SEE_LICENSE_4)) {
9999  INTERESTING(lDebug ? "Gen-LIC-4" : "See-file.LICENSE");
10000  }
10001  else if (INFILE(_LT_SEE_LICENSE_5)) {
10002  INTERESTING(lDebug ? "Gen-LIC-5" : "See-file.LICENSE");
10003  }
10004  else if (INFILE(_LT_SEE_LICENSE_6)) {
10005  INTERESTING(lDebug ? "Gen-LIC-6" : "See-file.LICENSE");
10006  }
10007  else if (INFILE(_LT_SEE_LICENSE_7)) {
10008  INTERESTING(lDebug ? "Gen-LIC-7" : "See-file.LICENSE");
10009  }
10010  else if (INFILE(_LT_SEE_LICENSE_8)) {
10011  INTERESTING(lDebug ? "Gen-LIC-8" : "See-file.LICENSE");
10012  }
10013  else if (INFILE(_LT_SEE_LICENSE_9)) {
10014  INTERESTING(lDebug ? "Gen-LIC-9" : "See-file.LICENSE");
10015  }
10016  else if (INFILE(_LT_SEE_LICENSE_10)) {
10017  INTERESTING(lDebug ? "Gen-LIC-10" : "See-file.LICENSE");
10018  }
10019  else if (INFILE(_LT_SEE_LICENSE_LAST1)) {
10020  INTERESTING(lDebug ? "Gen-LIC-L1" : "See-file.LICENSE");
10021  }
10022  else if (INFILE(_LT_SEE_LICENSE_LAST2)) {
10023  INTERESTING(lDebug ? "Gen-LIC-L2" : "See-file.LICENSE");
10024  }
10025  else if (INFILE(_LT_SEE_README_1)) {
10026  INTERESTING(lDebug ? "Gen-RDM-1" : "See-file.README");
10027  }
10028  else if (INFILE(_LT_SEE_README_2)) {
10029  INTERESTING(lDebug ? "Gen-RDM-2" : "See-file.README");
10030  }
10031  else if (INFILE(_LT_SEE_README_3)) {
10032  INTERESTING(lDebug ? "Gen-RDM-3" : "See-file.README");
10033  }
10034  else if (INFILE(_LT_SEE_README_4)) {
10035  INTERESTING(lDebug ? "Gen-RDM-4" : "See-file.README");
10036  }
10037  else if (INFILE(_LT_SEE_README_5)) {
10038  INTERESTING(lDebug ? "Gen-RDM-5" : "See-file.README");
10039  }
10040  else if (INFILE(_LT_SEE_README_6)) {
10041  INTERESTING(lDebug ? "Gen-RDM-6" : "See-file.README");
10042  }
10043  else if (INFILE(_LT_SEE_README_7)) {
10044  INTERESTING(lDebug ? "Gen-RDM-7" : "See-file.README");
10045  }
10046  else if (INFILE(_LT_SEE_README_LAST1)) {
10047  INTERESTING(lDebug ? "Gen-RDM-L1" : "See-file.README");
10048  }
10049  else if (INFILE(_LT_SEE_README_LAST2)) {
10050  INTERESTING(lDebug ? "Gen-RDM-L2" : "See-file.README");
10051  }
10052  else if (INFILE(_LT_SEE_OTHER_1)) {
10053  INTERESTING(lDebug ? "Gen-OTH-1" : "See-doc.OTHER");
10054  }
10055  else if (INFILE(_LT_SEE_OTHER_2)) {
10056  INTERESTING(lDebug ? "Gen-OTH-2" : "See-doc.OTHER");
10057  }
10058  else if (INFILE(_LT_SEE_OTHER_3)) {
10059  INTERESTING(lDebug ? "Gen-OTH-3" : "See-doc.OTHER");
10060  }
10061  else if (INFILE(_LT_SEE_OTHER_4)) {
10062  INTERESTING(lDebug ? "Gen-OTH-4" : "See-doc.OTHER");
10063  }
10064  else if (INFILE(_LT_SEE_OTHER_5)) {
10065  INTERESTING(lDebug ? "Gen-OTH-5" : "See-doc.OTHER");
10066  }
10067  else if (INFILE(_LT_SEE_OTHER_6)) {
10068  INTERESTING(lDebug ? "Gen-OTH-6" : "See-doc.OTHER");
10069  }
10070  else if (INFILE(_LT_SEE_OTHER_7)) {
10071  INTERESTING(lDebug ? "Gen-OTH-7" : "See-doc.OTHER");
10072  }
10073  else if (INFILE(_LT_SEE_OTHER_8)) {
10074  INTERESTING(lDebug ? "Gen-OTH-8" : "See-doc.OTHER");
10075  }
10076  else if (INFILE(_LT_SEE_OTHER_9)) {
10077  INTERESTING(lDebug ? "Gen-OTH-9" : "See-doc.OTHER");
10078  }
10079  else if (INFILE(_LT_SEE_OTHER_10)) {
10080  INTERESTING(lDebug ? "Gen-OTH-10" : "See-doc.OTHER");
10081  }
10082  else if (INFILE(_LT_SEE_OTHER_11)) {
10083  INTERESTING(lDebug ? "Gen-OTH-11" : "See-doc.OTHER");
10084  }
10085  else if (INFILE(_LT_SEE_OTHER_12)) {
10086  INTERESTING(lDebug ? "Gen-OTH-12" : "See-doc.OTHER");
10087  }
10088  else if (INFILE(_LT_SEE_OTHER_13)) {
10089  INTERESTING(lDebug ? "Gen-OTH-13" : "See-doc.OTHER");
10090  }
10091  else if (INFILE(_LT_SEE_OTHER_14)) {
10092  INTERESTING(lDebug ? "Gen-OTH-14" : "See-doc.OTHER");
10093  }
10094  else if (INFILE(_LT_SEE_OTHER_15)) {
10095  INTERESTING(lDebug ? "Gen-OTH-15" : "See-doc.OTHER");
10096  }
10097  else if (INFILE(_LT_SEE_OTHER_LAST1)) {
10098  INTERESTING(lDebug ? "Gen-OTH-L1" : "See-doc.OTHER");
10099  }
10100  else if (INFILE(_LT_SEE_OTHER_LAST2)) {
10101  INTERESTING(lDebug ? "Gen-OTH-L2" : "See-doc.OTHER");
10102  }
10103  else if (INFILE(_LT_SEE_OTHER_LAST3)) {
10104  INTERESTING(lDebug ? "Gen-OTH-L3" : "See-doc.OTHER");
10105  }
10106  else if (INFILE(_LT_SEE_OUTPUT_1)) {
10107  INTERESTING(lDebug ? "Gen-EXC-1" : "GNU-style.interactive");
10108  }
10109  return;
10110 #endif /* OLD_VERSION */
10111 }
10112 
10113 
10114 int checkPublicDomain(char *filetext, int size, int score, int kwbm,
10115  int isML, int isPS)
10116 {
10117  int ret;
10118 
10119 #ifdef PROC_TRACE
10120  traceFunc("== checkPublicDomain(%p, %d, %d, 0x%x, %d, %d)\n", filetext,
10121  size, score, kwbm, isML, isPS);
10122 #endif /* PROC_TRACE */
10123 
10124  if (pd >= 0) { /* already tried? */
10125  return(pd);
10126  }
10127  ret = 0; /* default answer is "no" */
10128  if (INFILE(_LT_PUBDOM_CC)) {
10129  INTERESTING(lDebug ? "Pubdom(CC)" : "CC-PDDC");
10130  ret = 1;
10131  } else if (INFILE(_LT_PUBDOM_ODC)) {
10132  INTERESTING(lDebug ? "Pubdom(ODC)" : LS_PD_CLM);
10133  ret = 1;
10134  } else if (INFILE(_LT_PUBDOM_PDD)) {
10135  INTERESTING(lDebug ? "Pubdom(PDD)" : LS_PD_CLM);
10136  ret = 1;
10137  } else if (INFILE(_LT_PUBDOM_USE)) {
10138  INTERESTING(lDebug ? "Pubdom(use)" : LS_PD_CLM);
10139  ret = 1;
10140  } else if (HASTEXT(_LT_PUBDOM_NOTclaim, REG_EXTENDED)) {
10141  INTERESTING(LS_NOT_PD);
10142  ret = 1;
10143  } else if (INFILE(_CR_PUBDOM)) {
10144  if (INFILE(_LT_PUBDOMNOTcpyrt)) {
10145  INTERESTING(LS_PD_CLM);
10146  } else {
10147  INTERESTING(LS_PD_CPRT);
10148  }
10149  ret = 1;
10150  } else if (INFILE(_CR_NONE)) {
10151  INTERESTING(lDebug ? "Pubdom(no-CR)" : LS_PD_CLM);
10152  ret = 1;
10153  } else if (INFILE(_LT_UNLIN) || URL_INFILE(_URL_UNLINref) || URL_INFILE(_URL_UNLIN)) {
10154  INTERESTING("Unlicense");
10155  ret = 1;
10156  } else if (INFILE(_LT_PUBDOM_1)) {
10157  INTERESTING(lDebug ? "Pubdom(1)" : LS_PD_CLM);
10158  ret = 1;
10159  } else if (INFILE(_LT_PUBDOM_2) && NOT_INFILE(_PHR_PUBLIC_FUNCT) && NOT_INFILE(_LT_NOTPUBDOM_1)) {
10160  INTERESTING(lDebug ? "Pubdom(2)" : LS_PD_CLM);
10161  ret = 1;
10162  } else if (INFILE(_LT_PUBDOM_3)) {
10163  INTERESTING(lDebug ? "Pubdom(3)" : LS_PD_CLM);
10164  ret = 1;
10165 #ifdef REMOVED_AS_TOO_BROAD
10166  } else if (INFILE(_LT_PUBDOM_4)) {
10167  INTERESTING(lDebug ? "Pubdom(4)" : LS_PD_CLM);
10168  ret = 1;
10169  } else if (INFILE(_LT_PUBDOM_5)) {
10170  INTERESTING(lDebug ? "Pubdom(5)" : LS_PD_CLM);
10171  ret = 1;
10172  } else if (INFILE(_LT_PUBDOM_6)) {
10173  INTERESTING(lDebug ? "No-more-copyright" : LS_PD_CLM);
10174  ret = 1;
10175 #endif // done removing too broad signatures
10176  } else if (INFILE(_LT_PUBDOM_7)) {
10177  INTERESTING(lDebug ? "Pubdom(7)" : LS_PD_CLM);
10178  ret = 1;
10179  } else if (INFILE(_LT_PUBDOM_8)) {
10180  INTERESTING(lDebug ? "Pubdom(8)" : LS_PD_CLM);
10181  ret = 1;
10182  } else if (INFILE(_LT_PUBDOM_9)) {
10183  INTERESTING(lDebug ? "Pubdom(9)" : LS_PD_CLM);
10184  ret = 1;
10185  } else if (INFILE(_LT_PUBDOM_10)) {
10186  if (INFILE(_LT_blessing)) {
10187  INTERESTING(lDebug ? "Pubdom(10)" : "blessing");
10188  }
10189  else {
10190  INTERESTING(lDebug ? "Pubdom(10)" : LS_PD_CLM);
10191  }
10192  ret = 1;
10193  } else if (INFILE(_URL_PUBDOM)) {
10194  INTERESTING(lDebug ? "Pubdom(URL)" : LS_PD_CLM);
10195  ret = 1;
10196  } else if (HASKW(kwbm, _KW_public_domain) && score <= 3) {
10197  INTERESTING(LS_PD_ONLY);
10198  ret = 1;
10199  }
10200  return(ret);
10201 }
10202 
10203 
10211 void checkCornerCases(char *filetext, int size, int score,
10212  int kwbm, int isML, int isPS, int nw, int force)
10213 {
10214 
10215 #ifdef PROC_TRACE
10216  traceFunc("== checkCornerCases(%p, %d, %d, %d, %d, %d, %d, %d)\n",
10217  filetext, size, score, kwbm, isML, isPS, nw, force);
10218 #endif /* PROC_TRACE */
10219 
10220  if (crCheck++) { /* only need to check this once */
10221  return;
10222  }
10223  if (INFILE(_LT_NOTATT_NOTBSD)) {
10224  LOWINTEREST("non-ATT-BSD");
10225  }
10226 
10227  /*
10228  * FINAL cases: (close to giving up) -- lowest-importance items
10229  */
10236  /*
10237  if (!(*licStr)) {
10238  if (HASTEXT(_TEXT_TRADEMARK, 0)) {
10239  LOWINTEREST(LS_TDMKONLY);
10240  }
10241  }
10242  */
10243  if (!(*licStr)) {
10244  /*
10245  * We may have matched something but ultimately determined there's nothing
10246  * significant or of any interest, so empty the list of any matches we may
10247  * have observed to this point.
10248  */
10249  listClear(&whereList, NO); /* force 'nothing to report' */
10250  }
10251  return;
10252 }
10253 
10254 int match3(int base, char *buf, int score, int save, int isML, int isPS)
10255 {
10256  int i;
10257  int j;
10258  char *cp;
10259  /* */
10260 #ifdef PROC_TRACE
10261 #ifdef PROC_TRACE_SWITCH
10262  if (gl.ptswitch)
10263 #endif /* PROC_TRACE_SWITCH */
10264  printf("== match3(%d, %p, %d, %d, %d, %d)\n", base, buf, score, save,
10265  isML, isPS);
10266 #else /* not PROC_TRACE */
10267 #ifdef UNKNOWN_CHECK_DEBUG
10268  printf("== match3(%d, %p, %d, %d, %d, %d)\n", base, buf, score, save,
10269  isML, isPS);
10270 #endif /* UNKNOWN_CHECK_DEBUG */
10271 #endif /* not PROC_TRACE */
10272  /* */
10273  for (i = 1; i <= 3; i++) {
10274  if (dbgIdxGrep(base+i, buf, (save && lDiags)) == 0) {
10275 #ifdef UNKNOWN_CHECK_DEBUG
10276  printf("match3: FAILED regex (%d)!\n", base+i);
10277 #endif /* UNKNOWN_CHECK_DEBUG */
10278  return(0);
10279  }
10280  }
10281 #ifdef UNKNOWN_CHECK_DEBUG
10282  printf("match3: Success (%s)!\n",
10283  (save ? "buffer-for-real" : "file-initial-check"));
10284 #endif /* UNKNOWN_CHECK_DEBUG */
10285  /*
10286  * Some "possible licenses" are technical descriptions that share some words
10287  * that typically appear in licenses (distribution, terms, permission(s)).
10288  *****
10289  * If we're checking a paragraph (e.g., "save" is non-zero), see if there are
10290  * other engineering-development-technical terms in the paragraph that tend
10291  * to NOT be present in licenses...
10292  */
10293  if (save) {
10294  for (j = i = 0, cp = buf; *cp; i++, cp++) {
10295  if (*cp & 0200) {
10296  j++;
10297  }
10298  }
10299 #ifdef UNKNOWN_CHECK_DEBUG
10300  printf("DEEBUG: %d bytes, %d 8-bit\n", i, j);
10301 #endif /* UNKNOWN_CHECK_DEBUG */
10302  if (j >= (i/2)) {
10303  if (lDiags) {
10304  printf("... no, >= 50 percent 8-bit characters\n");
10305  }
10306  return(0);
10307  }
10308  /*
10309  We need to allocate space for a doctored-up version of the candidate
10310  unknown-license paragraph, but it's ONLY used in this function. E.g.,
10311  make darn sure we free it up before exiting this function...
10312  */
10313  cp = copyString(buf, MTAG_TEXTPARA);
10314  doctorBuffer(cp, isML, isPS, NO);
10315  /*
10316  If we detected a no-warraty statement earlier, "checknw" is != 0.
10317  Look for a no-warrany statement in this candidate paragraph.
10318  If we find it, report failure for the paragraph and remember
10319  finding the no--warranty.
10320  */
10321  if (checknw && !idxGrep(checknw, cp, REG_ICASE|REG_EXTENDED)) {
10322  if (lDiags) {
10323  printf("... no, warranty regex %d\n", checknw);
10324  }
10325  checknw = 0;
10326  memFree(cp, MTAG_TEXTPARA);
10327  return(0);
10328  }
10329  /*
10330  False-positive-check: GNU/FSF template (often see in ".po"
10331  and ".c" files
10332 
10333  "This file is distributed under the same license as the
10334  package PACKAGE"
10335  */
10336  if (dbgIdxGrep(_LT_BOGUSTMPL, cp, lDiags)) {
10337  if (lDiags) {
10338  printf("... no, FSF-GNU template\n");
10339  }
10340  memFree(cp, MTAG_TEXTPARA);
10341  return(0);
10342  }
10343  /*
10344  * False-positive-check: GNU GPL preamble statements; these have been
10345  * "sprinkled" throughout files seen before, so check ALL of them.
10346  */
10347  if (dbgIdxGrep(_PHR_GNU_FREEDOM, cp, lDiags) ||
10348  dbgIdxGrep(_PHR_GNU_COPYING, cp, lDiags) ||
10349  dbgIdxGrep(_PHR_GNU_PROTECT, cp, lDiags)) {
10350  if (lDiags) {
10351  printf("... no, GNU-GPL preamble\n");
10352  }
10353  memFree(cp, MTAG_TEXTPARA);
10354  return(0);
10355  }
10356  if (lDiags) {
10357  printf("... candidate paragraph analysis:\n");
10358  }
10359  for (i = j = 0; i < NKEYWORDS; i++) {
10360  if (idxGrep_recordPositionDoctored(i + _KW_first, cp, REG_EXTENDED | REG_ICASE)) {
10361  if (lDiags) {
10362  printf("%s", j ? ", " : "KEYWORDS: ");
10363  printf("%s", _REGEX(i+_KW_first));
10364  }
10365  j++;
10366  }
10367  }
10368  if (lDiags) {
10369  if (j) {
10370  printf("\n");
10371  }
10372  printf("SCORES: para %d, file %d == %05.2f%% ", j,
10373  score, 100.0 * (float) j / (float) score);
10374  }
10375  /*
10376  Here, we guess that an UnclassifiedLicense exists in a paragraph
10377  when:
10378  + a paragraph has a keyword-score of at least 3 -OR-
10379  + ... a keyword-score of 2 *AND* is >= 50% of the file's
10380  total score
10381 
10382  It's likely we'll see a few false-positives with a
10383  keyword-score of 2 but there are cases where this works.
10384  We can filter out the 2-scores we see
10385  with the FILTER checks below...
10386  */
10387  if (j == 0) { /* no license-like keywords */
10388  if (lDiags) {
10389  printf("(ZERO legal keywords)\n");
10390  }
10391  memFree(cp, MTAG_TEXTPARA);
10392  return(0);
10393  }
10394  if (j >= 3 || (j == 2 && j*2 >= score)) {
10395  if (j >= 3 && lDiags) {
10396  printf("(LIKELY: para-score >= 2)\n");
10397  }
10398  else if (lDiags) {
10399  printf("(MAYBE: local percentage)\n");
10400  }
10401  }
10402  else {
10403  if (lDiags) {
10404  printf("(NOT LIKELY a license)\n");
10405 #if 0
10406 #endif
10407  printf("[FAILED]\n%s\n[/FAILED]\n", buf);
10408  }
10409  memFree(cp, MTAG_TEXTPARA);
10410  return(0);
10411  }
10412  /*
10413  Sure, there ARE paragraphs with these words that do NOT constitute a
10414  real license. Look for key words and phrases of them HERE. This list
10415  of filters will likely grow over time.
10416  */
10417  for (i = 0; i < NFILTER; i++) {
10418  if (dbgIdxGrep(_FILTER_first+i, buf, lDiags)) {
10419  if (lDiags) {
10420  printf("!! NO-LIC: filter %d\n", ++i);
10421  }
10422  memFree(cp, MTAG_TEXTPARA);
10423  return(0);
10424  }
10425  }
10426  if (cur.licPara == NULL_STR) {
10427  saveLicenseParagraph(buf, isML, isPS, YES);
10428  }
10429  memFree(cp, MTAG_TEXTPARA);
10430  }
10431 #ifdef UNKNOWN_CHECK_DEBUG
10432  else {
10433  printf("match3: Initial-check only (save == %d)\n", save);
10434  }
10435 #endif /* UNKNOWN_CHECK_DEBUG */
10436  return(1);
10437 }
10438 
10439 void saveLicenseParagraph(char *mtext, int isML, int isPS, int entireBuf)
10440 {
10441  char *cp;
10442  char *start;
10443  int index=0;
10444  int len;
10445  start = copyString(mtext, MTAG_TEXTPARA);
10446  if(!start)
10447  {
10448  LOG_FATAL("called saveLicenseParagraph without text")
10449  Bail(-__LINE__);
10450  }
10451 #ifdef PROC_TRACE
10452 #ifdef PROC_TRACE_SWITCH
10453  if (gl.ptswitch)
10454 #endif /* PROC_TRACE_SWITCH */
10455  printf("== saveLicenseParagraph(%p, %d, %d, %d)\n", mtext, isML, isPS, entireBuf);
10456 #endif /* PROC_TRACE */
10457  /* */
10458  if (entireBuf) {
10459  cur.licPara = copyString(mtext, MTAG_TEXTPARA);
10460  } else {
10461  if (cur.regm.rm_so < 50) {
10462  len = cur.regm.rm_eo + 80;
10463  } else {
10464  len = cur.regm.rm_eo + 130 - cur.regm.rm_so;
10465  index = cur.regm.rm_so - 50;
10466  }
10467  cur.licPara = memAlloc(len + 9, MTAG_TEXTPARA);
10468  (void) strcpy(cur.licPara, "... ");
10469  (void) strncpy(cur.licPara + 4, start + index, len);
10470  (void) strcpy(cur.licPara + len + 4, " ...");
10471  memFree(start, MTAG_TEXTPARA);
10472  }
10473 
10474  /*
10475  * Convert double-line-feed chars ("\r" and "\n" combos) to a single "\n"
10476  */
10477  for (cp = cur.licPara; *cp; cp++) {
10478  if ((*cp == '\n' || *cp == '\r') &&
10479  (*(cp+1) == '\r' || *(cp+1) == '\n')) {
10480  *cp = ' ';
10481  *(cp+1) = '\n';
10482  }
10483  }
10484  if (lDiags) {
10485  printf("[PERHAPS] (%p)\n%s\n[/PERHAPS]\n", cur.licPara, cur.licPara);
10486  }
10487  return;
10488 }
10489 
10498 void spdxReference(char *filetext, int size, int isML, int isPS)
10499 {
10500  if (INFILE(_SPDX_Glide)) {
10501  INTERESTING("Glide");
10502  }
10503  if (INFILE(_SPDX_Abstyles)) {
10504  INTERESTING("Abstyles");
10505  }
10506  if (INFILE(_SPDX_AFL_11)) {
10507  INTERESTING("AFL-1.1");
10508  }
10509  if (INFILE(_SPDX_AFL_12)) {
10510  INTERESTING("AFL-1.2");
10511  }
10512  if (INFILE(_SPDX_AFL_20)) {
10513  INTERESTING("AFL-2.0");
10514  }
10515  if (INFILE(_SPDX_AFL_21)) {
10516  INTERESTING("AFL-2.1");
10517  }
10518  if (INFILE(_SPDX_AFL_30)) {
10519  INTERESTING("AFL-3.0");
10520  }
10521  if (INFILE(_SPDX_AMPAS)) {
10522  INTERESTING("AMPAS");
10523  }
10524  if (INFILE(_SPDX_APL_10)) {
10525  INTERESTING("APL-1.0");
10526  }
10527  if (INFILE(_SPDX_Adobe_Glyph)) {
10528  INTERESTING("Adobe-Glyph");
10529  }
10530  if (INFILE(_SPDX_APAFML)) {
10531  INTERESTING("APAFML");
10532  }
10533  if (INFILE(_SPDX_Adobe_2006)) {
10534  INTERESTING("Adobe-2006");
10535  }
10536  if (INFILE(_SPDX_Afmparse)) {
10537  INTERESTING("Afmparse");
10538  }
10539  if (INFILE(_SPDX_Aladdin)) {
10540  INTERESTING("Aladdin");
10541  }
10542  if (INFILE(_SPDX_ADSL)) {
10543  INTERESTING("ADSL");
10544  }
10545  if (INFILE(_SPDX_AMDPLPA)) {
10546  INTERESTING("AMDPLPA");
10547  }
10548  if (INFILE(_SPDX_ANTLR_PD)) {
10549  INTERESTING("ANTLR-PD");
10550  }
10551  if (INFILE(_SPDX_AML)) {
10552  INTERESTING("AML");
10553  }
10554  if (INFILE(_SPDX_APSL_10)) {
10555  INTERESTING("APSL-1.0");
10556  }
10557  if (INFILE(_SPDX_APSL_11)) {
10558  INTERESTING("APSL-1.1");
10559  }
10560  if (INFILE(_SPDX_APSL_12)) {
10561  INTERESTING("APSL-1.2");
10562  }
10563  if (INFILE(_SPDX_APSL_20)) {
10564  INTERESTING("APSL-2.0");
10565  }
10566  if (INFILE(_SPDX_Artistic_10_Perl)) {
10567  INTERESTING("Artistic-1.0-Perl");
10568  }
10569  else if (INFILE(_SPDX_Artistic_10_cl8)) {
10570  INTERESTING("Artistic-1.0-cl8");
10571  }
10572  else if (INFILE(_SPDX_Artistic_10)) {
10573  INTERESTING("Artistic-1.0");
10574  }
10575  if (INFILE(_SPDX_Artistic_20)) {
10576  INTERESTING("Artistic-2.0");
10577  }
10578  if (INFILE(_SPDX_AAL)) {
10579  INTERESTING("AAL");
10580  }
10581  if (INFILE(_SPDX_Bahyph)) {
10582  INTERESTING("Bahyph");
10583  }
10584  if (INFILE(_SPDX_Barr)) {
10585  INTERESTING("Barr");
10586  }
10587  if (INFILE(_SPDX_Beerware)) {
10588  INTERESTING("Beerware");
10589  }
10590  if (INFILE(_SPDX_BitTorrent_10)) {
10591  INTERESTING("BitTorrent-1.0");
10592  }
10593  else if (INFILE(_SPDX_BitTorrent_11)) {
10594  INTERESTING("BitTorrent-1.1");
10595  }
10596  if (INFILE(_SPDX_blessing)) {
10597  INTERESTING("blessing");
10598  }
10599  if (INFILE(_SPDX_BlueOak_100)) {
10600  INTERESTING("BlueOak-1.0.0");
10601  }
10602  if (INFILE(_SPDX_BSL_10)) {
10603  INTERESTING("BSL-1.0");
10604  }
10605  if (INFILE(_SPDX_Borceux)) {
10606  INTERESTING("Borceux");
10607  }
10608  if (INFILE(_SPDX_0BSD)) {
10609  INTERESTING("0BSD");
10610  }
10611  if (INFILE(_SPDX_bzip2_105)) {
10612  INTERESTING("bzip2-1.0.5");
10613  }
10614  else if (INFILE(_SPDX_bzip2_106)) {
10615  INTERESTING("bzip2-1.0.6");
10616  }
10617  if (INFILE(_SPDX_Caldera)) {
10618  INTERESTING("Caldera");
10619  }
10620  if (INFILE(_SPDX_CC_PDDC)) {
10621  INTERESTING("CC-PDDC");
10622  }
10623  if (INFILE(_SPDX_CERN_OHL_P_20)) {
10624  INTERESTING("CERN-OHL-P-2.0");
10625  }
10626  else if (INFILE(_SPDX_CERN_OHL_S_20)) {
10627  INTERESTING("CERN-OHL-S-2.0");
10628  }
10629  else if (INFILE(_SPDX_CERN_OHL_W_20)) {
10630  INTERESTING("CERN-OHL-W-2.0");
10631  }
10632  else if (INFILE(_SPDX_CERN_OHL_12)) {
10633  INTERESTING("CERN-OHL-1.2");
10634  }
10635  else if (INFILE(_SPDX_CERN_OHL_11)) {
10636  INTERESTING("CERN-OHL-1.1");
10637  }
10638  if (INFILE(_SPDX_ClArtistic)) {
10639  INTERESTING("ClArtistic");
10640  }
10641  if (INFILE(_SPDX_CNRI_Jython)) {
10642  INTERESTING("CNRI-Jython");
10643  }
10644  if (INFILE(_SPDX_CPOL_102)) {
10645  INTERESTING("CPOL-1.02");
10646  }
10647  if (INFILE(_SPDX_CPAL_10)) {
10648  INTERESTING("CPAL-1.0");
10649  }
10650  if (INFILE(_SPDX_CPL_10)) {
10651  INTERESTING("CPL-1.0");
10652  }
10653  if (INFILE(_SPDX_CAL_10_Combined_Work_Exception)) {
10654  INTERESTING("CAL-1.0-Combined-Work-Exception");
10655  }
10656  else if (INFILE(_SPDX_CAL_10)) {
10657  INTERESTING("CAL-1.0");
10658  }
10659  if (INFILE(_SPDX_CATOSL_11)) {
10660  INTERESTING("CATOSL-1.1");
10661  }
10662  if (INFILE(_SPDX_Condor_11)) {
10663  INTERESTING("Condor-1.1");
10664  }
10665  if (INFILE(_SPDX_CC_BY_10)) {
10666  INTERESTING("CC-BY-1.0");
10667  }
10668  else if (INFILE(_SPDX_CC_BY_20)) {
10669  INTERESTING("CC-BY-2.0");
10670  }
10671  else if (INFILE(_SPDX_CC_BY_25)) {
10672  INTERESTING("CC-BY-2.5");
10673  }
10674  else if (INFILE(_SPDX_CC_BY_30_AT)) {
10675  INTERESTING("CC-BY-3.0-AT");
10676  }
10677  else if (INFILE(_SPDX_CC_BY_30)) {
10678  INTERESTING("CC-BY-3.0");
10679  }
10680  else if (INFILE(_SPDX_CC_BY_40)) {
10681  INTERESTING("CC-BY-4.0");
10682  }
10683  if (INFILE(_SPDX_CC_BY_ND_10)) {
10684  INTERESTING("CC-BY-ND-1.0");
10685  }
10686  else if (INFILE(_SPDX_CC_BY_ND_20)) {
10687  INTERESTING("CC-BY-ND-2.0");
10688  }
10689  else if (INFILE(_SPDX_CC_BY_ND_25)) {
10690  INTERESTING("CC-BY-ND-2.5");
10691  }
10692  else if (INFILE(_SPDX_CC_BY_ND_30)) {
10693  INTERESTING("CC-BY-ND-3.0");
10694  }
10695  else if (INFILE(_SPDX_CC_BY_ND_40)) {
10696  INTERESTING("CC-BY-ND-4.0");
10697  }
10698  if (INFILE(_SPDX_CC_BY_NC_10)) {
10699  INTERESTING("CC-BY-NC-1.0");
10700  }
10701  else if (INFILE(_SPDX_CC_BY_NC_20)) {
10702  INTERESTING("CC-BY-NC-2.0");
10703  }
10704  else if (INFILE(_SPDX_CC_BY_NC_25)) {
10705  INTERESTING("CC-BY-NC-2.5");
10706  }
10707  else if (INFILE(_SPDX_CC_BY_NC_30)) {
10708  INTERESTING("CC-BY-NC-3.0");
10709  }
10710  else if (INFILE(_SPDX_CC_BY_NC_40)) {
10711  INTERESTING("CC-BY-NC-4.0");
10712  }
10713  if (INFILE(_SPDX_CC_BY_NC_ND_10)) {
10714  INTERESTING("CC-BY-NC-ND-1.0");
10715  }
10716  else if (INFILE(_SPDX_CC_BY_NC_ND_20)) {
10717  INTERESTING("CC-BY-NC-ND-2.0");
10718  }
10719  else if (INFILE(_SPDX_CC_BY_NC_ND_25)) {
10720  INTERESTING("CC-BY-NC-ND-2.5");
10721  }
10722  else if (INFILE(_SPDX_CC_BY_NC_ND_30_IGO)) {
10723  INTERESTING("CC-BY-NC-ND-3.0-IGO");
10724  }
10725  else if (INFILE(_SPDX_CC_BY_NC_ND_30)) {
10726  INTERESTING("CC-BY-NC-ND-3.0");
10727  }
10728  else if (INFILE(_SPDX_CC_BY_NC_ND_40)) {
10729  INTERESTING("CC-BY-NC-ND-4.0");
10730  }
10731  if (INFILE(_SPDX_CC_BY_NC_SA_10)) {
10732  INTERESTING("CC-BY-NC-SA-1.0");
10733  }
10734  else if (INFILE(_SPDX_CC_BY_NC_SA_20)) {
10735  INTERESTING("CC-BY-NC-SA-2.0");
10736  }
10737  else if (INFILE(_SPDX_CC_BY_NC_SA_25)) {
10738  INTERESTING("CC-BY-NC-SA-2.5");
10739  }
10740  else if (INFILE(_SPDX_CC_BY_NC_SA_30)) {
10741  INTERESTING("CC-BY-NC-SA-3.0");
10742  }
10743  else if (INFILE(_SPDX_CC_BY_NC_SA_40)) {
10744  INTERESTING("CC-BY-NC-SA-4.0");
10745  }
10746  if (INFILE(_SPDX_CC_BY_SA_10)) {
10747  INTERESTING("CC-BY-SA-1.0");
10748  }
10749  else if (INFILE(_SPDX_CC_BY_SA_20)) {
10750  INTERESTING("CC-BY-SA-2.0");
10751  }
10752  else if (INFILE(_SPDX_CC_BY_SA_25)) {
10753  INTERESTING("CC-BY-SA-2.5");
10754  }
10755  else if (INFILE(_SPDX_CC_BY_SA_30_AT)) {
10756  INTERESTING("CC-BY-SA-3.0-AT");
10757  }
10758  else if (INFILE(_SPDX_CC_BY_SA_30)) {
10759  INTERESTING("CC-BY-SA-3.0");
10760  }
10761  else if (INFILE(_SPDX_CC_BY_SA_40)) {
10762  INTERESTING("CC-BY-SA-4.0");
10763  }
10764  if (INFILE(_SPDX_CDLA_Permissive_10)) {
10765  INTERESTING("CDLA-Permissive-1.0");
10766  }
10767  if (INFILE(_SPDX_CDLA_Sharing_10)) {
10768  INTERESTING("CDLA-Sharing-1.0");
10769  }
10770  if (INFILE(_SPDX_Crossword)) {
10771  INTERESTING("Crossword");
10772  }
10773  if (INFILE(_SPDX_CrystalStacker)) {
10774  INTERESTING("CrystalStacker");
10775  }
10776  if (INFILE(_SPDX_CUA_OPL_10)) {
10777  INTERESTING("CUA-OPL-1.0");
10778  }
10779  if (INFILE(_SPDX_Cube)) {
10780  INTERESTING("Cube");
10781  }
10782  if (INFILE(_SPDX_curl)) {
10783  INTERESTING("curl");
10784  }
10785  if (INFILE(_SPDX_D_FSL_10)) {
10786  INTERESTING("D-FSL-1.0");
10787  }
10788  if (INFILE(_SPDX_diffmark)) {
10789  INTERESTING("diffmark");
10790  }
10791  if (INFILE(_SPDX_WTFPL)) {
10792  INTERESTING("WTFPL");
10793  }
10794  if (HASTEXT(_SPDX_DOC, REG_EXTENDED) || HASTEXT(_PHR_DOC, REG_EXTENDED)) {
10795  INTERESTING("DOC");
10796  }
10797  if (INFILE(_SPDX_Dotseqn)) {
10798  INTERESTING("Dotseqn");
10799  }
10800  if (INFILE(_SPDX_DSDP)) {
10801  INTERESTING("DSDP");
10802  }
10803  if (INFILE(_SPDX_dvipdfm)) {
10804  INTERESTING("dvipdfm");
10805  }
10806  if (INFILE(_SPDX_EPL_10)) {
10807  INTERESTING("EPL-1.0");
10808  }
10809  else if (INFILE(_SPDX_EPL_20)) {
10810  INTERESTING("EPL-2.0");
10811  }
10812  if (INFILE(_SPDX_ECL_10)) {
10813  INTERESTING("ECL-1.0");
10814  }
10815  if (INFILE(_SPDX_ECL_20)) {
10816  INTERESTING("ECL-2.0");
10817  }
10818  if (INFILE(_SPDX_eGenix)) {
10819  INTERESTING("eGenix");
10820  }
10821  if (INFILE(_SPDX_EFL_10)) {
10822  INTERESTING("EFL-1.0");
10823  }
10824  if (INFILE(_SPDX_EFL_20)) {
10825  INTERESTING("EFL-2.0");
10826  }
10827  if (INFILE(_SPDX_Entessa)) {
10828  INTERESTING("Entessa");
10829  }
10830  if (INFILE(_SPDX_EPICS)) {
10831  INTERESTING("EPICS");
10832  }
10833  if (INFILE(_SPDX_ErlPL_11)) {
10834  INTERESTING("ErlPL-1.1");
10835  }
10836  if (INFILE(_SPDX_etalab_20)) {
10837  INTERESTING("etalab-2.0");
10838  }
10839  if (INFILE(_SPDX_EUDatagrid)) {
10840  INTERESTING("EUDatagrid");
10841  }
10842  if (INFILE(_SPDX_EUPL_10)) {
10843  INTERESTING("EUPL-1.0");
10844  }
10845  else if (INFILE(_SPDX_EUPL_11)) {
10846  INTERESTING("EUPL-1.1");
10847  }
10848  else if (INFILE(_SPDX_EUPL_12)) {
10849  INTERESTING("EUPL-1.2");
10850  }
10851  if (INFILE(_SPDX_Eurosym)) {
10852  INTERESTING("Eurosym");
10853  }
10854  if (HASTEXT(_SPDX_Fair, REG_EXTENDED) || HASTEXT(_PHR_Fair, REG_EXTENDED)) {
10855  INTERESTING("Fair");
10856  }
10857  if (INFILE(_SPDX_Frameworx_10)) {
10858  INTERESTING("Frameworx-1.0");
10859  }
10860  if (INFILE(_SPDX_FreeImage)) {
10861  INTERESTING("FreeImage");
10862  }
10863  if (INFILE(_SPDX_FSFAP)) {
10864  INTERESTING("FSFAP");
10865  }
10866  if (INFILE(_SPDX_FSFULLR)) {
10867  INTERESTING("FSFULLR");
10868  }
10869  else if (INFILE(_SPDX_FSFUL)) {
10870  INTERESTING("FSFUL");
10871  }
10872  if (INFILE(_SPDX_Giftware)) {
10873  INTERESTING("Giftware");
10874  }
10875  if (INFILE(_SPDX_GL2PS)) {
10876  INTERESTING("GL2PS");
10877  }
10878  if (INFILE(_SPDX_Glulxe)) {
10879  INTERESTING("Glulxe");
10880  }
10881  if (INFILE(_SPDX_GFDL_11_invariants_or_later)) {
10882  INTERESTING("GFDL-1.1-invariants-or-later");
10883  }
10884  else if (INFILE(_SPDX_GFDL_11_no_invariants_or_later)) {
10885  INTERESTING("GFDL-1.1-no-invariants-or-later");
10886  }
10887  else if (INFILE(_SPDX_GFDL_11_invariants_only)) {
10888  INTERESTING("GFDL-1.1-invariants-only");
10889  }
10890  else if (INFILE(_SPDX_GFDL_11_no_invariants_only)) {
10891  INTERESTING("GFDL-1.1-no-invariants-only");
10892  }
10893  else if (INFILE(_SPDX_GFDL_11_or_later)
10894  || HASTEXT(_SPDX_GFDL_11plus, REG_EXTENDED)
10895  || HASTEXT(_PHR_GFDL_11plus, REG_EXTENDED))
10896  {
10897  INTERESTING("GFDL-1.1-or-later");
10898  }
10899  else if (INFILE(_SPDX_GFDL_11)) {
10900  INTERESTING("GFDL-1.1-only");
10901  }
10902  else if (INFILE(_SPDX_GFDL_12_invariants_or_later)) {
10903  INTERESTING("GFDL-1.2-invariants-or-later");
10904  }
10905  else if (INFILE(_SPDX_GFDL_12_no_invariants_or_later)) {
10906  INTERESTING("GFDL-1.2-no-invariants-or-later");
10907  }
10908  else if (INFILE(_SPDX_GFDL_12_invariants_only)) {
10909  INTERESTING("GFDL-1.2-invariants-only");
10910  }
10911  else if (INFILE(_SPDX_GFDL_12_no_invariants_only)) {
10912  INTERESTING("GFDL-1.2-no-invariants-only");
10913  }
10914  else if (INFILE(_SPDX_GFDL_12_or_later)
10915  || HASTEXT(_SPDX_GFDL_12plus, REG_EXTENDED)
10916  || HASTEXT(_PHR_GFDL_12plus, REG_EXTENDED))
10917  {
10918  INTERESTING("GFDL-1.2-or-later");
10919  }
10920  else if (INFILE(_SPDX_GFDL_12)) {
10921  INTERESTING("GFDL-1.2-only");
10922  }
10923  else if (INFILE(_SPDX_GFDL_13_invariants_or_later)) {
10924  INTERESTING("GFDL-1.3-invariants-or-later");
10925  }
10926  else if (INFILE(_SPDX_GFDL_13_no_invariants_or_later)) {
10927  INTERESTING("GFDL-1.3-no-invariants-or-later");
10928  }
10929  else if (INFILE(_SPDX_GFDL_13_invariants_only)) {
10930  INTERESTING("GFDL-1.3-invariants-only");
10931  }
10932  else if (INFILE(_SPDX_GFDL_13_no_invariants_only)) {
10933  INTERESTING("GFDL-1.3-no-invariants-only");
10934  }
10935  else if (INFILE(_SPDX_GFDL_13_or_later)
10936  || HASTEXT(_SPDX_GFDL_13plus, REG_EXTENDED)
10937  || HASTEXT(_PHR_GFDL_13plus, REG_EXTENDED))
10938  {
10939  INTERESTING("GFDL-1.3-or-later");
10940  }
10941  else if (INFILE(_SPDX_GFDL_13)) {
10942  INTERESTING("GFDL-1.3");
10943  }
10944  if (INFILE(_SPDX_GLWTPL)) {
10945  INTERESTING("GLWTPL");
10946  }
10947  if (INFILE(_SPDX_gnuplot)) {
10948  INTERESTING("gnuplot");
10949  }
10950  if (INFILE(_SPDX_gSOAP_13b)) {
10951  INTERESTING("gSOAP-1.3b");
10952  }
10953  if (INFILE(_SPDX_HaskellReport)) {
10954  INTERESTING("HaskellReport");
10955  }
10956  if (INFILE(_SPDX_Hippocratic_21)) {
10957  INTERESTING("Hippocratic-2.1");
10958  }
10959  if (INFILE(_SPDX_HPND_sell_variant)) {
10960  INTERESTING("HPND-sell-variant");
10961  }
10962  else if (INFILE(_SPDX_HPND)) {
10963  INTERESTING("HPND");
10964  }
10965  if (INFILE(_SPDX_IBM_pibs)) {
10966  INTERESTING("IBM-pibs");
10967  }
10968  if (INFILE(_SPDX_IPL_10)) {
10969  INTERESTING("IPL-1.0");
10970  }
10971  if (INFILE(_SPDX_ImageMagick)) {
10972  INTERESTING("ImageMagick");
10973  }
10974  if (INFILE(_SPDX_iMatix)) {
10975  INTERESTING("iMatix");
10976  }
10977  if (INFILE(_SPDX_Imlib2)) {
10978  INTERESTING("Imlib2");
10979  }
10980  if (INFILE(_SPDX_IJG)) {
10981  INTERESTING("IJG");
10982  }
10983  if (INFILE(_SPDX_Info_ZIP)) {
10984  INTERESTING("Info-ZIP");
10985  }
10986  if (INFILE(_SPDX_Interbase_10)) {
10987  INTERESTING("Interbase-1.0");
10988  }
10989  if (INFILE(_SPDX_IPA)) {
10990  INTERESTING("IPA");
10991  }
10992  if (INFILE(_SPDX_ISC)) {
10993  INTERESTING("ISC");
10994  }
10995  if (INFILE(_SPDX_JasPer_20)) {
10996  INTERESTING("JasPer-2.0");
10997  }
10998  if (INFILE(_SPDX_JPNIC)) {
10999  INTERESTING("JPNIC");
11000  }
11001  if (INFILE(_SPDX_JSON)) {
11002  INTERESTING("JSON");
11003  }
11004  if (INFILE(_SPDX_Latex2e)) {
11005  INTERESTING("Latex2e");
11006  }
11007  if (INFILE(_SPDX_Leptonica)) {
11008  INTERESTING("Leptonica");
11009  }
11010  if (INFILE(_SPDX_LGPLLR)) {
11011  INTERESTING("LGPLLR");
11012  }
11013  if (INFILE(_SPDX_libpng_20)) {
11014  INTERESTING("libpng-2.0");
11015  }
11016  else if (INFILE(_SPDX_Libpng)) {
11017  INTERESTING("Libpng");
11018  }
11019  if (INFILE(_SPDX_libselinux_10)) {
11020  INTERESTING("libselinux-1.0");
11021  }
11022  if (INFILE(_SPDX_libtiff)) {
11023  INTERESTING("libtiff");
11024  }
11025  if (INFILE(_SPDX_LAL_12)) {
11026  INTERESTING("LAL-1.2");
11027  }
11028  if (INFILE(_SPDX_LAL_13)) {
11029  INTERESTING("LAL-1.3");
11030  }
11031  if (INFILE(_SPDX_LiLiQ_P_11)) {
11032  INTERESTING("LiLiQ-P-1.1");
11033  }
11034  if (INFILE(_SPDX_LiLiQ_Rplus_11)) {
11035  INTERESTING("LiLiQ-Rplus-1.1");
11036  }
11037  if (INFILE(_SPDX_LiLiQ_R_11)) {
11038  INTERESTING("LiLiQ-R-1.1");
11039  }
11040  if (INFILE(_SPDX_Linux_OpenIB)) {
11041  INTERESTING("Linux-OpenIB");
11042  }
11043  if (INFILE(_SPDX_LPL_102)) {
11044  INTERESTING("LPL-1.02");
11045  }
11046  else if (INFILE(_SPDX_LPL_10)) {
11047  INTERESTING("LPL-1.0");
11048  }
11049  if (INFILE(_SPDX_LPPL_10)) {
11050  INTERESTING("LPPL-1.0");
11051  }
11052  if (INFILE(_SPDX_LPPL_11)) {
11053  INTERESTING("LPPL-1.1");
11054  }
11055  if (INFILE(_SPDX_LPPL_12)) {
11056  INTERESTING("LPPL-1.2");
11057  }
11058  if (INFILE(_SPDX_LPPL_13a)) {
11059  INTERESTING("LPPL-1.3a");
11060  }
11061  if (INFILE(_SPDX_LPPL_13c)) {
11062  INTERESTING("LPPL-1.3c");
11063  }
11064  if (INFILE(_SPDX_MakeIndex)) {
11065  INTERESTING("MakeIndex");
11066  }
11067  if (INFILE(_SPDX_MTLL)) {
11068  INTERESTING("MTLL");
11069  }
11070  if (INFILE(_SPDX_MS_PL)) {
11071  INTERESTING("MS-PL");
11072  }
11073  if (INFILE(_SPDX_MS_RL)) {
11074  INTERESTING("MS-RL");
11075  }
11076  if (INFILE(_SPDX_MirOS)) {
11077  INTERESTING("MirOS");
11078  }
11079  if (INFILE(_SPDX_MITNFA)) {
11080  INTERESTING("MITNFA");
11081  }
11082  if (!lmem[_fREAL] && INFILE(_SPDX_Motosoto)) {
11083  INTERESTING("Motosoto");
11084  }
11085  if (INFILE(_SPDX_mpich2)) {
11086  INTERESTING("mpich2");
11087  }
11088  if (INFILE(_SPDX_MulanPSL_20)) {
11089  INTERESTING("MulanPSL-2.0");
11090  }
11091  else if (INFILE(_SPDX_MulanPSL_10)) {
11092  INTERESTING("MulanPSL-1.0");
11093  }
11094  if (INFILE(_SPDX_Multics)) {
11095  INTERESTING("Multics");
11096  }
11097  if (INFILE(_SPDX_Mup)) {
11098  INTERESTING("Mup");
11099  }
11100  if (INFILE(_SPDX_NASA_13)) {
11101  INTERESTING("NASA-1.3");
11102  }
11103  if (INFILE(_SPDX_Naumen)) {
11104  INTERESTING("Naumen");
11105  }
11106  if (INFILE(_SPDX_NBPL_10)) {
11107  INTERESTING("NBPL-1.0");
11108  }
11109  if (INFILE(_SPDX_NCGL_UK_20)) {
11110  INTERESTING("NCGL-UK-2.0");
11111  }
11112  if (INFILE(_SPDX_Net_SNMP)) {
11113  INTERESTING("Net-SNMP");
11114  }
11115  if (INFILE(_SPDX_NetCDF)) {
11116  INTERESTING("NetCDF");
11117  }
11118  if (INFILE(_SPDX_NGPL)) {
11119  INTERESTING("NGPL");
11120  }
11121  if (INFILE(_SPDX_NIST_PD_fallback)) {
11122  INTERESTING("NIST-PD-fallback");
11123  }
11124  else if (INFILE(_SPDX_NIST_PD)) {
11125  INTERESTING("NIST-PD");
11126  }
11127  if (INFILE(_SPDX_NOSL)) {
11128  INTERESTING("NOSL");
11129  }
11130  if (INFILE(_SPDX_NPL_10)) {
11131  INTERESTING("NPL-1.0");
11132  }
11133  if (INFILE(_SPDX_NPL_11)) {
11134  INTERESTING("NPL-1.1");
11135  }
11136  if (INFILE(_SPDX_Newsletr)) {
11137  INTERESTING("Newsletr");
11138  }
11139  if (INFILE(_SPDX_NLPL)) {
11140  INTERESTING("NLPL");
11141  }
11142  if (INFILE(_SPDX_Nokia) && NOT_INFILE(_LT_OPENSSL_NOKIA)) {
11143  INTERESTING("Nokia");
11144  }
11145  if (INFILE(_SPDX_NPOSL_30)) {
11146  INTERESTING("NPOSL-3.0");
11147  }
11148  if (INFILE(_SPDX_NLOD_10)) {
11149  INTERESTING("NLOD-1.0");
11150  }
11151  if (INFILE(_SPDX_Noweb)) {
11152  INTERESTING("Noweb");
11153  }
11154  if (INFILE(_SPDX_NRL)) {
11155  INTERESTING("NRL");
11156  }
11157  if (INFILE(_SPDX_NTP_0)) {
11158  INTERESTING("NTP-0");
11159  }
11160  else if (INFILE(_SPDX_NTP)) {
11161  INTERESTING("NTP");
11162  }
11163  if (INFILE(_SPDX_Nunit)) {
11164  INTERESTING("Nunit");
11165  }
11166  if (INFILE(_SPDX_O_UDA_10)) {
11167  INTERESTING("O-UDA-1.0");
11168  }
11169  if (INFILE(_SPDX_OCLC_20)) {
11170  INTERESTING("OCLC-2.0");
11171  }
11172  if (INFILE(_SPDX_ODbL_10)) {
11173  INTERESTING("ODbL-1.0");
11174  }
11175  if (INFILE(_SPDX_OGC_10)) {
11176  INTERESTING("OGC-1.0");
11177  }
11178  if (INFILE(_SPDX_PDDL_10)) {
11179  INTERESTING("PDDL-1.0");
11180  }
11181  if (INFILE(_SPDX_OCCT_PL)) {
11182  INTERESTING("OCCT-PL");
11183  }
11184  if (INFILE(_SPDX_ODC_By_10)) {
11185  INTERESTING("ODC-By-1.0");
11186  }
11187  if (INFILE(_SPDX_OGL_Canada_20)) {
11188  INTERESTING("OGL-Canada-2.0");
11189  }
11190  if (INFILE(_SPDX_OGL_UK_10)) {
11191  INTERESTING("OGL-UK-1.0");
11192  }
11193  else if (INFILE(_SPDX_OGL_UK_20)) {
11194  INTERESTING("OGL-UK-2.0");
11195  }
11196  else if (INFILE(_SPDX_OGL_UK_30)) {
11197  INTERESTING("OGL-UK-3.0");
11198  }
11199  if (INFILE(_SPDX_OGTSL)) {
11200  INTERESTING("OGTSL");
11201  }
11202  if (INFILE(_SPDX_OLDAP_11)) {
11203  INTERESTING("OLDAP-1.1");
11204  }
11205  else if (INFILE(_SPDX_OLDAP_12)) {
11206  INTERESTING("OLDAP-1.2");
11207  }
11208  else if (INFILE(_SPDX_OLDAP_13)) {
11209  INTERESTING("OLDAP-1.3");
11210  }
11211  else if (INFILE(_SPDX_OLDAP_14)) {
11212  INTERESTING("OLDAP-1.4");
11213  }
11214  else if (INFILE(_SPDX_OLDAP_201)) {
11215  INTERESTING("OLDAP-2.0.1");
11216  }
11217  else if (INFILE(_SPDX_OLDAP_20)) {
11218  INTERESTING("OLDAP-2.0");
11219  }
11220  else if (INFILE(_SPDX_OLDAP_21)) {
11221  INTERESTING("OLDAP-2.1");
11222  }
11223  else if (INFILE(_SPDX_OLDAP_221)) {
11224  INTERESTING("OLDAP-2.2.1");
11225  }
11226  else if (INFILE(_SPDX_OLDAP_222)) {
11227  INTERESTING("OLDAP-2.2.2");
11228  }
11229  else if (INFILE(_SPDX_OLDAP_22)) {
11230  INTERESTING("OLDAP-2.2");
11231  }
11232  else if (INFILE(_SPDX_OLDAP_23)) {
11233  INTERESTING("OLDAP-2.3");
11234  }
11235  else if (INFILE(_SPDX_OLDAP_24)) {
11236  INTERESTING("OLDAP-2.4");
11237  }
11238  else if (INFILE(_SPDX_OLDAP_25)) {
11239  INTERESTING("OLDAP-2.5");
11240  }
11241  else if (INFILE(_SPDX_OLDAP_26)) {
11242  INTERESTING("OLDAP-2.6");
11243  }
11244  else if (INFILE(_SPDX_OLDAP_27)) {
11245  INTERESTING("OLDAP-2.7");
11246  }
11247  else if (INFILE(_SPDX_OLDAP_28)) {
11248  INTERESTING("OLDAP-2.8");
11249  }
11250  if (INFILE(_SPDX_OML)) {
11251  INTERESTING("OML");
11252  }
11253  if (INFILE(_SPDX_OPL_10)) {
11254  INTERESTING("OPL-1.0");
11255  }
11256  if (INFILE(_SPDX_OSL_10)) {
11257  INTERESTING("OSL-1.0");
11258  }
11259  if (INFILE(_SPDX_OSL_11)) {
11260  INTERESTING("OSL-1.1");
11261  }
11262  if (INFILE(_SPDX_OSL_20)) {
11263  INTERESTING("OSL-2.0");
11264  }
11265  if (INFILE(_SPDX_OSL_21)) {
11266  INTERESTING("OSL-2.1");
11267  }
11268  if (INFILE(_SPDX_OSL_30)) {
11269  INTERESTING("OSL-3.0");
11270  }
11271  if (INFILE(_SPDX_OSET_PL_21)) {
11272  INTERESTING("OSET-PL-2.1");
11273  }
11274  if (INFILE(_SPDX_Parity_700)) {
11275  INTERESTING("Parity-7.0.0");
11276  }
11277  else if (INFILE(_SPDX_Parity_600)) {
11278  INTERESTING("Parity-6.0.0");
11279  }
11280  if (INFILE(_SPDX_PHP_301)) {
11281  INTERESTING("PHP-3.01");
11282  }
11283  else if (INFILE(_SPDX_PHP_30)) {
11284  INTERESTING("PHP-3.0");
11285  }
11286  if (INFILE(_SPDX_Plexus)) {
11287  INTERESTING("Plexus");
11288  }
11289  if (INFILE(_SPDX_PolyForm_Noncommercial_100)) {
11290  INTERESTING("PolyForm-Noncommercial-1.0.0");
11291  }
11292  else if (INFILE(_SPDX_PolyForm_Small_Business_100)) {
11293  INTERESTING("PolyForm-Small-Business-1.0.0");
11294  }
11295  if (INFILE(_SPDX_PostgreSQL)) {
11296  INTERESTING("PostgreSQL");
11297  }
11298  if (INFILE(_SPDX_PSF_20)) {
11299  INTERESTING("PSF-2.0");
11300  }
11301  if (INFILE(_SPDX_psfrag)) {
11302  INTERESTING("psfrag");
11303  }
11304  if (INFILE(_SPDX_psutils)) {
11305  INTERESTING("psutils");
11306  }
11307  if (INFILE(_SPDX_Python_20)) {
11308  INTERESTING("Python-2.0");
11309  }
11310  if (INFILE(_SPDX_QPL_10)) {
11311  INTERESTING("QPL-1.0");
11312  }
11313  if (INFILE(_SPDX_Qhull)) {
11314  INTERESTING("Qhull");
11315  }
11316  if (INFILE(_SPDX_Rdisc)) {
11317  INTERESTING("Rdisc");
11318  }
11319  if (INFILE(_SPDX_RPSL_10)) {
11320  INTERESTING("RPSL-1.0");
11321  }
11322  if (INFILE(_SPDX_RPL_11)) {
11323  INTERESTING("RPL-1.1");
11324  }
11325  if (INFILE(_SPDX_RPL_15)) {
11326  INTERESTING("RPL-1.5");
11327  }
11328  if (INFILE(_SPDX_RHeCos_11)) {
11329  INTERESTING("RHeCos-1.1");
11330  }
11331  if (INFILE(_SPDX_RSCPL)) {
11332  INTERESTING("RSCPL");
11333  }
11334  if (INFILE(_SPDX_RSA_MD)) {
11335  INTERESTING("RSA-MD");
11336  }
11337  if (INFILE(_SPDX_Ruby)) {
11338  INTERESTING("Ruby");
11339  }
11340  if (INFILE(_SPDX_SAX_PD)) {
11341  INTERESTING("SAX-PD");
11342  }
11343  if (INFILE(_SPDX_Saxpath)) {
11344  INTERESTING("Saxpath");
11345  }
11346  if (INFILE(_SPDX_SHL_051)) {
11347  INTERESTING("SHL-0.51");
11348  }
11349  else if (INFILE(_SPDX_SHL_05)) {
11350  INTERESTING("SHL-0.5");
11351  }
11352  if (INFILE(_SPDX_SCEA)) {
11353  INTERESTING("SCEA");
11354  }
11355  if (INFILE(_SPDX_SWL)) {
11356  INTERESTING("SWL");
11357  }
11358  if (INFILE(_SPDX_SMPPL)) {
11359  INTERESTING("SMPPL");
11360  }
11361  if (INFILE(_SPDX_Sendmail_823)) {
11362  INTERESTING("Sendmail-8.23");
11363  }
11364  else if (INFILE(_SPDX_Sendmail)) {
11365  INTERESTING("Sendmail");
11366  }
11367  if (INFILE(_SPDX_SGI_B_10)) {
11368  INTERESTING("SGI-B-1.0");
11369  }
11370  if (INFILE(_SPDX_SGI_B_11)) {
11371  INTERESTING("SGI-B-1.1");
11372  }
11373  if (INFILE(_SPDX_SGI_B_20)) {
11374  INTERESTING("SGI-B-2.0");
11375  }
11376  if (INFILE(_SPDX_SimPL_20)) {
11377  INTERESTING("SimPL-2.0");
11378  }
11379  if (INFILE(_SPDX_Sleepycat)) {
11380  INTERESTING("Sleepycat");
11381  }
11382  if (INFILE(_SPDX_SNIA)) {
11383  INTERESTING("SNIA");
11384  }
11385  if (INFILE(_SPDX_Spencer_86)) {
11386  INTERESTING("Spencer-86");
11387  }
11388  if (INFILE(_SPDX_Spencer_94)) {
11389  INTERESTING("Spencer-94");
11390  }
11391  if (INFILE(_SPDX_Spencer_99)) {
11392  INTERESTING("Spencer-99");
11393  }
11394  if (INFILE(_SPDX_SMLNJ)) {
11395  INTERESTING("SMLNJ");
11396  }
11397  if (INFILE(_SPDX_SSH_OpenSSH)) {
11398  INTERESTING("SSH-OpenSSH");
11399  }
11400  if (INFILE(_SPDX_SSH_short)) {
11401  INTERESTING("SSH-short");
11402  }
11403  if (INFILE(_SPDX_SSPL_10)) {
11404  INTERESTING("SSPL-1.0");
11405  }
11406  if (INFILE(_SPDX_SugarCRM_113)) {
11407  INTERESTING("SugarCRM-1.1.3");
11408  }
11409  if (INFILE(_SPDX_SISSL_12)) {
11410  INTERESTING("SISSL-1.2");
11411  }
11412  else if (!lmem[_fREAL] && INFILE(_SPDX_SISSL)) {
11413  INTERESTING("SISSL");
11414  }
11415  if (INFILE(_SPDX_SPL_10)) {
11416  INTERESTING("SPL-1.0");
11417  }
11418  if (INFILE(_SPDX_Watcom_10)) {
11419  INTERESTING("Watcom-1.0");
11420  }
11421  if (INFILE(_SPDX_TAPR_OHL_10)) {
11422  INTERESTING("TAPR-OHL-1.0");
11423  }
11424  if (INFILE(_SPDX_TCP_wrappers)) {
11425  INTERESTING("TCP-wrappers");
11426  }
11427  if (INFILE(_SPDX_Unlicense)) {
11428  INTERESTING("Unlicense");
11429  }
11430  if (INFILE(_SPDX_TMate)) {
11431  INTERESTING("TMate");
11432  }
11433  if (INFILE(_SPDX_TORQUE_11)) {
11434  INTERESTING("TORQUE-1.1");
11435  }
11436  if (INFILE(_SPDX_TOSL)) {
11437  INTERESTING("TOSL");
11438  }
11439  if (INFILE(_SPDX_TU_Berlin_10)) {
11440  INTERESTING("TU-Berlin-1.0");
11441  }
11442  else if (INFILE(_SPDX_TU_Berlin_20)) {
11443  INTERESTING("TU-Berlin-2.0");
11444  }
11445  if (INFILE(_SPDX_UCL_10)) {
11446  INTERESTING("UCL-1.0");
11447  }
11448  if (INFILE(_SPDX_Unicode_DFS_2015)) {
11449  INTERESTING("Unicode-DFS-2015");
11450  }
11451  if (INFILE(_SPDX_Unicode_DFS_2016)) {
11452  INTERESTING("Unicode-DFS-2016");
11453  }
11454  if (INFILE(_SPDX_Unicode_TOU)) {
11455  INTERESTING("Unicode-TOU");
11456  }
11457  if (INFILE(_SPDX_UPL_10)) {
11458  INTERESTING("UPL-1.0");
11459  }
11460  if (INFILE(_SPDX_NCSA)) {
11461  INTERESTING("NCSA");
11462  }
11463  if (INFILE(_SPDX_Vim)) {
11464  INTERESTING("Vim");
11465  }
11466  if (INFILE(_SPDX_VOSTROM)) {
11467  INTERESTING("VOSTROM");
11468  }
11469  if (INFILE(_SPDX_VSL_10)) {
11470  INTERESTING("VSL-1.0");
11471  }
11472  if (INFILE(_SPDX_W3C_20150513)) {
11473  INTERESTING("W3C-20150513");
11474  }
11475  else if (INFILE(_SPDX_W3C_19980720)) {
11476  INTERESTING("W3C-19980720");
11477  }
11478  else if (INFILE(_SPDX_W3C)) {
11479  INTERESTING("W3C");
11480  }
11481  if (INFILE(_SPDX_Wsuipa)) {
11482  INTERESTING("Wsuipa");
11483  }
11484  if (!lmem[_fREAL] && INFILE(_SPDX_Xnet)) {
11485  INTERESTING("Xnet");
11486  }
11487  if (INFILE(_SPDX_X11)) {
11488  INTERESTING("X11");
11489  }
11490  if (INFILE(_SPDX_Xerox)) {
11491  INTERESTING("Xerox");
11492  }
11493  if (INFILE(_SPDX_XFree86_11)) {
11494  INTERESTING("XFree86-1.1");
11495  }
11496  if (INFILE(_SPDX_xinetd)) {
11497  INTERESTING("xinetd");
11498  }
11499  if (INFILE(_SPDX_xpp)) {
11500  INTERESTING("xpp");
11501  }
11502  if (INFILE(_SPDX_XSkat)) {
11503  INTERESTING("XSkat");
11504  }
11505  if (INFILE(_SPDX_YPL_10)) {
11506  INTERESTING("YPL-1.0");
11507  }
11508  if (INFILE(_SPDX_YPL_11)) {
11509  INTERESTING("YPL-1.1");
11510  }
11511  if (INFILE(_SPDX_Zed)) {
11512  INTERESTING("Zed");
11513  }
11514  if (INFILE(_SPDX_Zend_20)) {
11515  INTERESTING("Zend-2.0");
11516  }
11517  if (INFILE(_SPDX_Zimbra_13)) {
11518  INTERESTING("Zimbra-1.3");
11519  }
11520  if (INFILE(_SPDX_Zimbra_14)) {
11521  INTERESTING("Zimbra-1.4");
11522  }
11523  return;
11524 }
11525 
11530 void copyleftExceptions(char *filetext, int size, int isML, int isPS)
11531 {
11532  if (INFILE(_SPDX_389_exception)) {
11533  INTERESTING("389-exception");
11534  }
11535  if (INFILE(_SPDX_Autoconf_exception_20)) {
11536  INTERESTING("Autoconf-exception-2.0");
11537  }
11538  if (INFILE(_SPDX_Autoconf_exception_30)) {
11539  INTERESTING("Autoconf-exception-3.0");
11540  }
11541  if (INFILE(_SPDX_Bison_exception_22)) {
11542  INTERESTING("Bison-exception-2.2");
11543  }
11544  if (INFILE(_SPDX_Bootloader_exception)) {
11545  INTERESTING("Bootloader-exception");
11546  }
11547  if (INFILE(_SPDX_Classpath_exception_20)) {
11548  INTERESTING("Classpath-exception-2.0");
11549  }
11550  if (INFILE(_SPDX_CLISP_exception_20)) {
11551  INTERESTING("CLISP-exception-2.0");
11552  }
11553  if (INFILE(_SPDX_DigiRule_FOSS_exception)) {
11554  INTERESTING("DigiRule-FOSS-exception");
11555  }
11556  if (INFILE(_SPDX_eCos_exception_20)) {
11557  INTERESTING("eCos-exception-2.0");
11558  }
11559  if (INFILE(_SPDX_Fawkes_Runtime_exception)) {
11560  INTERESTING("Fawkes-Runtime-exception");
11561  }
11562  if (INFILE(_SPDX_FLTK_exception)) {
11563  INTERESTING("FLTK-exception");
11564  }
11565  if (INFILE(_SPDX_Font_exception_20)) {
11566  INTERESTING("Font-exception-2.0");
11567  }
11568  if (INFILE(_SPDX_freertos_exception_20)) {
11569  INTERESTING("freertos-exception-2.0");
11570  }
11571  if (INFILE(_SPDX_GCC_exception_20)) {
11572  INTERESTING("GCC-exception-2.0");
11573  }
11574  if (INFILE(_SPDX_GCC_exception_31)) {
11575  INTERESTING("GCC-exception-3.1");
11576  }
11577  if (INFILE(_SPDX_gnu_javamail_exception)) {
11578  INTERESTING("gnu-javamail-exception");
11579  }
11580  if (INFILE(_SPDX_i2p_gpl_java_exception)) {
11581  INTERESTING("i2p-gpl-java-exception");
11582  }
11583  if (INFILE(_SPDX_Libtool_exception)) {
11584  INTERESTING("Libtool-exception");
11585  }
11586  if (INFILE(_SPDX_Linux_syscall_note)) {
11587  INTERESTING("Linux-syscall-note");
11588  }
11589  if (INFILE(_SPDX_LLVM_exception)) {
11590  INTERESTING("LLVM-exception");
11591  }
11592  if (INFILE(_SPDX_LZMA_exception)) {
11593  INTERESTING("LZMA-exception");
11594  }
11595  if (INFILE(_SPDX_mif_exception)) {
11596  INTERESTING("mif-exception");
11597  }
11598  if (INFILE(_SPDX_Nokia_Qt_exception_11)) {
11599  INTERESTING("Nokia-Qt-exception-1.1");
11600  }
11601  if (INFILE(_SPDX_OCCT_exception_10)) {
11602  INTERESTING("OCCT-exception-1.0");
11603  }
11604  if (INFILE(_SPDX_OpenJDK_assembly_exception_10)) {
11605  INTERESTING("OpenJDK-assembly-exception-1.0");
11606  }
11607  if (INFILE(_SPDX_openvpn_openssl_exception)) {
11608  INTERESTING("openvpn-openssl-exception");
11609  }
11610  if (INFILE(_SPDX_Qwt_exception_10)) {
11611  INTERESTING("Qwt-exception-1.0");
11612  }
11613  if (INFILE(_SPDX_u_boot_exception_20)) {
11614  INTERESTING("u-boot-exception-2.0");
11615  }
11616  if (INFILE(_SPDX_WxWindows_exception_31)) {
11617  INTERESTING("WxWindows-exception-3.1");
11618  }
11619  /*
11620  * Find exception phrases. There are similar phrases
11621  * in exception clauses. Therefore 'else if' structure
11622  * has to be used to get correct detections.
11623  */
11624  if (INFILE(_LT_389_exception)) {
11625  INTERESTING("389-exception");
11626  }
11627  else if (INFILE(_LT_Autoconf_exception_20)) {
11628  INTERESTING("Autoconf-exception-2.0");
11629  }
11630  else if (INFILE(_LT_GPL_EXCEPT_5) && INFILE(_LT_Autoconf_exception_30)) {
11631  INTERESTING("Autoconf-exception-3.0");
11632  }
11633  else if (INFILE(_PHR_Autoconf_exception_30)) {
11634  INTERESTING("Autoconf-exception-3.0");
11635  }
11636  else if (INFILE(_LT_Autoconf_exception_3)) {
11637  INTERESTING("Autoconf-exception");
11638  }
11639  else if (INFILE(_LT_Bison_exception_22)) {
11640  INTERESTING("Bison-exception-2.2");
11641  }
11642  else if (INFILE(_LT_Bison_exception_1) || INFILE(_LT_Bison_exception_2)) {
11643  INTERESTING("Bison-exception");
11644  }
11645  else if (INFILE(_LT_Bootloader_exception)) {
11646  INTERESTING("Bootloader-exception");
11647  }
11648  /* Contains similar text to classpath-exception */
11649  else if (INFILE(_LT_OpenJDK_assembly_exception_10_1) || HASTEXT(_LT_OpenJDK_assembly_exception_10_2, 0)) {
11650  INTERESTING("OpenJDK-assembly-exception-1.0");
11651  }
11652  else if (INFILE(_LT_GPL_EXCEPT_6)) {
11653  if (INFILE(_LT_mif_exception)) {
11654  INTERESTING("Fawkes-Runtime-exception");
11655  }
11656  else {
11657  INTERESTING("Classpath-exception-2.0");
11658  }
11659  }
11660  else if (INFILE(_LT_classpath_exception_1)) {
11661  INTERESTING("Classpath-exception-2.0");
11662  }
11663  else if (HASTEXT(_LT_CLISP_exception_20_1, 0) && INFILE(_LT_CLISP_exception_20_2)) {
11664  INTERESTING("CLISP-exception-2.0");
11665  }
11666  else if (HASTEXT(_TITLE_DigiRule_FOSS_exception, 0) || INFILE(_LT_DigiRule_FOSS_exception)) {
11667  INTERESTING("DigiRule-FOSS-exception");
11668  }
11669  else if (INFILE(_LT_eCos_exception) && INFILE(_LT_GPL_EXCEPT_7)) {
11670  INTERESTING("eCos-exception-2.0");
11671  }
11672  else if (HASTEXT(_LT_FLTK_exception, 0)) {
11673  INTERESTING("FLTK-exception");
11674  }
11675  else if (HASTEXT(_TEXT_FONT, REG_EXTENDED) || INFILE(_LT_FONT_EXCEPTION_20)) {
11676  INTERESTING("Font-exception-2.0");
11677  }
11678  else if (HASTEXT(_LT_freertos_exception_20, 0)) {
11679  INTERESTING("freertos-exception-2.0");
11680  }
11681  else if (INFILE(_LT_freertos_exception_1) || INFILE(_LT_freertos_exception_2)) {
11682  INTERESTING("freertos-exception");
11683  }
11684  else if (INFILE(_LT_GCC_exception_31_1) || INFILE(_LT_GCC_exception_31_2)) {
11685  INTERESTING("GCC-exception-3.1");
11686  }
11687  else if (INFILE(_LT_GCC_exception_20)) {
11688  INTERESTING("GCC-exception-2.0");
11689  }
11690  /* This wording is very similar to GCC_exception_20 */
11691  else if (INFILE(_LT_linking_exception_1)) {
11692  INTERESTING("linking-exception");
11693  }
11694  else if (HASTEXT(_TEXT_GCC, REG_EXTENDED)) {
11695  INTERESTING("GCC-exception");
11696  }
11697  else if (INFILE(_LT_gnu_javamail_exception_1) || INFILE(_LT_gnu_javamail_exception_2)) {
11698  INTERESTING("gnu-javamail-exception");
11699  }
11700  else if (INFILE(_LT_i2p_gpl_java_exception)) {
11701  INTERESTING("i2p-gpl-java-exception");
11702  }
11703  else if (INFILE(_LT_GPL_EXCEPT_1) || INFILE(_LT_GPL_EXCEPT_2)) {
11704  if (HASTEXT(_LT_Libtool_exception, 0)) {
11705  INTERESTING("Libtool-exception");
11706  }
11707  if (HASTEXT(_LT_Autoconf_exception_2, REG_EXTENDED) || INFILE(_LT_Autoconf_exception_1)) {
11708  INTERESTING("Autoconf-exception");
11709  }
11710  }
11711  else if (INFILE(_LT_Linux_syscall_note)) {
11712  INTERESTING("Linux-syscall-note");
11713  }
11714  else if (HASTEXT(_LT_LLVM_exception_1, 0) || HASTEXT(_LT_LLVM_exception_2, 0)) {
11715  INTERESTING("LLVM-exception");
11716  }
11717  else if (INFILE(_LT_LZMA_exception)) {
11718  INTERESTING("LZMA-exception");
11719  }
11720  else if (INFILE(_LT_mif_exception)) {
11721  INTERESTING("mif-exception");
11722  }
11723  else if (HASTEXT(_LT_OCCT_exception_10_1, REG_EXTENDED) || INFILE(_LT_OCCT_exception_10_2)) {
11724  INTERESTING("OCCT-exception-1.0");
11725  }
11726  else if (INFILE(_LT_openvpn_openssl_exception)) {
11727  INTERESTING("openvpn-openssl-exception");
11728  }
11729  else if (HASTEXT(_TITLE_QT_GPL_EXCEPTION_10, 0)) {
11730  INTERESTING("Qt-GPL-exception-1.0");
11731  }
11732  else if (HASTEXT(_LT_QT_GPL_EXCEPTION_10_1, 0) && INFILE(_LT_QT_GPL_EXCEPTION_10_2)) {
11733  INTERESTING("Qt-GPL-exception-1.0");
11734  }
11735  else if (HASTEXT(_LT_QT_GPL_EXCEPTION, 0) && HASTEXT(_LT_QT_GPL_EXCEPTION_10_3, 0)) {
11736  INTERESTING("Qt-GPL-exception-1.0");
11737  }
11738  else if (INFILE(_TITLE_Nokia_Qt_LGPL_exception_11)) {
11739  INTERESTING("Nokia-Qt-exception-1.1");
11740  }
11741  else if (INFILE(_TITLE_QT_LGPL_EXCEPTION_11)) {
11742  INTERESTING("Qt-LGPL-exception-1.1");
11743  }
11744  else if (INFILE(_LT_Qwt_exception_10_1)) {
11745  INTERESTING("Qwt-exception-1.0");
11746  }
11747  else if (HASTEXT(_LT_Qwt_exception_10_2, 0)) {
11748  INTERESTING("Qwt-exception-1.0");
11749  }
11750  else if (INFILE(_LT_WxWindows_exception_31)) {
11751  INTERESTING("WxWindows-exception-3.1");
11752  }
11753  /*
11754  * Full license text includes reference to LGPL-2.0-only
11755  * exception clause.
11756  */
11757  else if (INFILE(_PHR_WXWINDOWS_31)) {
11758  INTERESTING("WxWindows-exception-3.1");
11759  INTERESTING("LGPL-2.0-or-later");
11760  }
11761  /*
11762  * This is a vague reference to WxWindows license without
11763  * an exception reference.
11764  */
11765  else if (INFILE(_PHR_WXWINDOWS)) {
11766  INTERESTING("WxWindows");
11767  }
11768  else if (HASTEXT(_LT_u_boot_exception_20, REG_EXTENDED)) {
11769  INTERESTING("u-boot-exception-2.0");
11770  }
11771  else if (HASTEXT(_LT_GPL_EXCEPT_Trolltech, REG_EXTENDED)) {
11772  INTERESTING("trolltech-exception");
11773  }
11774  else if (INFILE(_LT_OpenSSL_exception_1) || INFILE(_LT_OpenSSL_exception_2)) {
11775  INTERESTING("OpenSSL-exception");
11776  }
11777  else if (INFILE(_LT_GPL_UPX_EXCEPT) && !HASTEXT(_LT_IGNORE_CLAUSE, REG_EXTENDED)) {
11778  INTERESTING("UPX-exception");
11779  }
11780  else if (INFILE(_URL_mysql_floss_exception) || HASTEXT(_TITLE_mysql_floss_exception, 0)) {
11781  INTERESTING(lDebug ? "mysql-floss-exception(URL)" : "mysql-floss-exception");
11782  }
11783  else if (INFILE(_TITLE_Oracle_foss_exception) || INFILE(_LT_Oracle_foss_exception)) {
11784  INTERESTING("Oracle-foss-exception");
11785  }
11786  else if (INFILE(_LT_linking_exception_2) || (INFILE(_LT_linking_exception_3) && INFILE(_LT_GPL_EXCEPT_7))) {
11787  INTERESTING("linking-exception");
11788  }
11789  else if (HASTEXT(_TITLE_universal_foss_exception_10, 0)
11790  || URL_INFILE(_URL_universal_foss_exception_10)
11791  || INFILE(_LT_universal_foss_exception_10)) {
11792  INTERESTING("universal-foss-exception-1.0");
11793  }
11794  else if (INFILE(_LT_GPL_EXCEPT_1)) {
11795  INTERESTING(lDebug ? "GPL-except-1" : "GPL-exception");
11796  }
11797  else if (INFILE(_LT_GPL_EXCEPT_2)) {
11798  INTERESTING(lDebug ? "GPL-except-2" : "GPL-exception");
11799  }
11800  else if (INFILE(_LT_GPL_EXCEPT_3)) {
11801  INTERESTING(lDebug ? "GPL-except-3" : "GPL-exception");
11802  }
11803  else if (INFILE(_LT_GPL_EXCEPT_4)) {
11804  INTERESTING(lDebug ? "GPL-except-4" : "GPL-exception");
11805  }
11806  else if (INFILE(_LT_GPL_EXCEPT_7)) {
11807  INTERESTING("linking-exception");
11808  }
11809  else if (INFILE(_LT_GPL_SWI_PROLOG_EXCEPT)) {
11810  INTERESTING(lDebug ? "GPL-swi-prolog" : "GPL-exception");
11811  }
11812 
11813  return;
11814 }
11815 
11816 #ifdef LTSR_DEBUG
11817 #define LT_TARGET 1299 /* set to -1 OR the string# to track */
11818 void showLTCache(char *msg)
11819 {
11820  int i = 0;
11821  int nCached = 0;
11822  int nMatch = 0;
11823 
11824  printf("%s\n", msg);
11825  if (LT_TARGET >= 0) {
11826  printf("... tracking string #%d\n", LT_TARGET);
11827  }
11828  while (i < NFOOTPRINTS) {
11829  if (ltsr[i] < LTSR_SMASK) {
11830  printf(i == LT_TARGET ? "x" : ".");
11831  } else if (ltsr[i] == LTSR_YES) {
11832  printf("%%");
11833  nMatch++;
11834  nCached++;
11835  } else {
11836  printf(i == LT_TARGET ? "0" : ":");
11837  nCached++;
11838  }
11839  if ((++i % 75) == 0) {
11840  printf("|%04d\n", i);
11841  }
11842  }
11843  printf("\nLTSR-matches: %d, Cached: %d\n", nMatch, nCached);
11844  return;
11845 }
11846 #endif /* LTSR_DEBUG */
11847 
11848 #ifdef DOCTOR_DEBUG
11849 /*
11850  Debugging
11851  */
11852 void dumpMatch(char *text, char *label)
11853 {
11854  char *x = text + cur.regm.rm_so;
11855  char *cp = text + cur.regm.rm_eo;
11856 
11857  if (label) {
11858  printf("%s ", label);
11859  }
11860  printf("@ %d [", cur.regm.rm_so);
11861  for (; x < cp; x++) {
11862  if (!isEOL(*x)) {
11863  printf("%c", *x);
11864  }
11865  }
11866  printf("]\n");
11867  return;
11868 }
11869 
11870 #endif /* DOCTOR_DEBUG */
void doctorBuffer(char *buf, int isML, int isPS, int isCR)
Convert a buffer of multiple stuff to text-only, separated by spaces.
void listDump(list_t *l, int verbose)
print the passed in list
Definition: list.c:829
item_t * listGetItem(list_t *l, char *s)
get an item from the itemlist. If the item is not in the itemlist, then add it to the itemlist.
Definition: list.c:246
void listIterationReset(list_t *l)
Rest list ix to -1.
Definition: list.c:513
void listInit(list_t *l, int size, char *label)
intialize a list, if the list is not empty, empty it (initialize it to zero's).
Definition: list.c:54
item_t * listIterate(list_t *l)
return a pointer to listitem, returns a NULL_ITEM when no more items to return.
Definition: list.c:477
void listSort(list_t *l, int sortType)
Sort the list as per the sortType passed.
Definition: list.c:631
void listClear(list_t *l, int deallocFlag)
Destroy list_t.
Definition: list.c:106
if(!preg_match("/\s$projectGroup\s/", $groups) &&(posix_getgid() !=$gInfo[ 'gid']))
get monk license list of one specified uploadtree_id
Definition: migratetest.php:33
void printRegexMatch(int n, int cached)
CDB – Need to review this code, particularly for the use of an external file (Nomos....
Definition: util.c:986
char * getInstances(char *textp, int size, int nBefore, int nAfter, char *regex, int recordOffsets)
Get occurrence of a regex in a given string pointer.
Definition: util.c:630
char * copyString(char *s, char *label)
Create a copy of a string.
Definition: util.c:593
void Assert(int fatalFlag, const char *fmt,...)
Raise an assert.
Definition: util.c:1395
char * findEol(char *s)
Find first ROL in a string.
Definition: util.c:378
licText_t licText[]
Nomos header file.
#define NULL_ITEM
NULL item.
Definition: nomos.h:231
#define memFree(x, y)
Definition: nomos.h:531
#define NULL_STR
NULL string.
Definition: nomos.h:235
#define _SEED(x)
Definition: nomos.h:451
#define _REGEX(x)
Definition: nomos.h:447
#define isEOL(x)
Check if x points to a EOL character.
Definition: nomos.h:240
#define YES
Definition: nomos.h:175
#define LTSR_RMASK
Definition: nomos.h:196
#define LTSR_NO
Definition: nomos.h:199
#define NO
Definition: nomos.h:171
#define LTSR_SMASK
Definition: nomos.h:197
void Bail(int exitval)
Close connections and exit.
Definition: nomos_utils.c:537
#define FL_SAVEBASE
Definition: nomos.h:155
#define NULL_CHAR
NULL character.
Definition: nomos.h:234
#define LTSR_YES
Definition: nomos.h:198
#define OPTS_DEBUG
Definition: nomos.h:138
int optionIsSet(int val)
Check if an CLI option is set.
Definition: nomos_utils.c:564
int idxGrep_recordPosition(int index, char *data, int flags)
compile a regex, perform the search and record findings
Definition: nomos_regex.c:220
int idxGrep(int index, char *data, int flags)
compile a regex, and perform the search (on data?)
Definition: nomos_regex.c:205
int strGrep(char *regex, char *data, int flags)
General-purpose grep function, used for one-time-only searches.
Definition: nomos_regex.c:139
int idxGrep_recordPositionDoctored(int index, char *data, int flags)
compile a regex, perform the search and record findings
Definition: nomos_regex.c:241
int strNbuf(char *data, char *str)
Check if a string exists in buffer (case insensitive)
Definition: nomos_regex.c:528
void cleanLicenceBuffer()
Clean the license buffer.
Definition: nomos_utils.c:1015
FUNCTION void addLicence(GArray *theMatches, char *licenceName)
Add a license to the matches array.
Definition: nomos_utils.c:1000
#define NY_INFILE(x)
Calls fileHasPatt() with qType 4.
Definition: parse.c:196
#define URL_INFILE(x)
Check in file with qType 0|1.
Definition: parse.c:202
char * aslVersion(char *, int, int, int)
Check for ASL Apache versions.
Definition: parse.c:7455
static char licStr[myBUFSIZ]
Definition: parse.c:164
#define RM_INFILE(x)
Calls fileHasPatt() with qType 1.
Definition: parse.c:193
void addRef(char *, int)
This function fills in a character-buffer for a license of a CURRENT file being evaluated,...
Definition: parse.c:9542
char * pythonVersion(char *, int, int, int)
Check for python versions.
Definition: parse.c:7806
char * gfdlVersion(char *, int, int, int)
Check for GFDL versions.
Definition: parse.c:8165
static int lDebug
Definition: parse.c:179
static int lDiags
Definition: parse.c:180
void checkCornerCases(char *, int, int, int, int, int, int, int)
If we call this function, we still don't know anything about a license.
Definition: parse.c:10211
#define HASREGEX(x, cp)
Calls idxGrep()
Definition: parse.c:199
#define PARSE_ARGS
Arguments to parse.
Definition: parse.c:188
#define SEEN(x)
Check LTSR_SMASK on lstr[x].
Definition: parse.c:190
char * cplVersion(char *, int, int, int)
Check for CPL versions.
Definition: parse.c:8519
#define NOT_INFILE(x)
Calls fileHasPatt()
Definition: parse.c:192
int findPhrase(int, char *, int, int, int, int)
Check for the presence of a phrase in a file by first searching for the search key provided.
Definition: parse.c:8719
char * parseLicenses(char *filetext, int size, scanres_t *scp, int isML, int isPS)
Parse a file to check all the possible licenses and add them to matches.
Definition: parse.c:359
static char * sisslVersion(char *, int, int, int)
Check for SISSL versions.
Definition: parse.c:7428
static char * gplVersion(char *, int, int, int)
Check for GPL versions.
Definition: parse.c:8340
char * lpplVersion(char *, int, int, int)
Check for LPPL versions.
Definition: parse.c:7981
#define HASTEXT(x, fl)
Calls idxGrep_recordIndex()
Definition: parse.c:201
char * oslVersion(char *, int, int, int)
Check for OSL versions.
Definition: parse.c:7901
void checkFileReferences(char *, int, int, int, int, int)
Generic license-phrases referring to other files or running commands.
Definition: parse.c:9877
static int dbgIdxGrep(int, char *, int)
Debugging call for idxGrep()
Definition: parse.c:316
static struct @1 kludge
void saveRegexLocation(int, int, int, int)
Save a regex in whereList.
Definition: parse.c:9490
#define INFILE(x)
Calls fileHasPatt()
Definition: parse.c:191
int checkUnclassified(char *, int, int, int, int, int)
This function is called when all the above license-checks don't turn up anything useful....
Definition: parse.c:9730
void locateRegex(char *, item_t *, int, int, int, int)
Locate a regex in a given file.
Definition: parse.c:9209
#define HASREGEX_RI(x, cp)
Calls idxGrep_recordIndex()
Definition: parse.c:200
char * cddlVersion(char *, int, int, int)
Check for CDDL versions.
Definition: parse.c:7941
int famOPENLDAP(char *, int, int, int)
Utility function to search for OpenLDAP licenses. So many different footprints are used by OpenLDAP,...
Definition: parse.c:9628
char * lgplVersion(char *, int, int, int)
Check for LGPL versions.
Definition: parse.c:8231
static int fileHasPatt(int licTextIdx, char *filetext, int size, int isML, int isPS, int qType)
Checks for a phrase in a file.
Definition: parse.c:248
static char ltsr[NFOOTPRINTS]
Definition: parse.c:166
char * aflVersion(char *, int, int, int)
Check for AFL versions.
Definition: parse.c:7861
void spdxReference(char *, int, int, int)
Definition: parse.c:10498
void copyleftExceptions(char *, int, int, int)
Definition: parse.c:11530
char * ccVersion(char *, int, int, int)
Check for CC_BY-X versions.
Definition: parse.c:8550
char * agplVersion(char *, int, int, int)
Check for AGPL versions.
Definition: parse.c:8087
char * mplNplVersion(char *, int, int, int)
Check for MPL|NPL versions.
Definition: parse.c:7639
#define PERL_INFILE(x)
Calls fileHasPatt() with qType 3.
Definition: parse.c:195
static char * realVersion(char *, int, int, int, int)
Check for RPSL versions.
Definition: parse.c:7756
#define GPL_INFILE(x)
Calls fileHasPatt() with qType 2.
Definition: parse.c:194
static int pd
Definition: parse.c:175
#define LVAL(x)
Check LTSR_RMASK on lstr[x].
Definition: parse.c:189
start($application)
start the application Assumes application is restartable via /etc/init.d/<script>....
Definition: pkgConfig.php:1214
GArray * theMatches
Definition: nomos.h:417
int uPsize
Size.
Definition: nomos.h:349
int flags
Flags.
Definition: nomos.h:348
char progName[64]
Program name.
Definition: nomos.h:346
searchString_t text
License text.
Definition: nomos.h:335
char * regex
License regex.
Definition: nomos.h:435
char * tseed
unencrypted license text
Definition: nomos.h:436
list_t type structure used to keep various lists. (e.g. there are multiple lists).
Definition: nomos.h:308
item_t * items
Definition: nomos.h:317
int used
Definition: nomos.h:310
tricky data structure used for a list of 'items'
Definition: nomos.h:274
void * buf
Definition: nomos.h:279
char * str
Definition: nomos.h:278
int score
License match score.
Definition: nomos.h:457
int csLen
String length.
Definition: nomos.h:325