8671f154ecf878a7b08888dda191e40467eec231
[gnupg.git] / jnlib / ChangeLog
1 2008-10-29  Werner Koch  <wk@g10code.com>
2
3         * w32-gettext.c (gettext): Return if no domain is loaded.
4         Reported by Tom Pegios.
5
6 2008-10-28  Werner Koch  <wk@g10code.com>
7
8         * w32-gettext.c (gettext): Try the binary search if the string was
9         not found in the hash table.
10
11 2008-10-20  Werner Koch  <wk@g10code.com>
12
13         * w32-afunix.c (_w32_sock_connect): Mark ADDRLEN as unused.
14
15         * dotlock.c (release_dotlock): Do not mix declaration and code.
16
17         * stringhelp.c (make_basename): Silent gcc warning about unused arg.
18         * argparse.c (store_alias): Ditto.
19         (find_long_option): 
20
21 2008-10-15  Werner Koch  <wk@g10code.com>
22
23         * logging.c (do_logv) [W32]: Flush the log stream.
24
25 2008-09-29  Werner Koch  <wk@g10code.com>
26
27         * argparse.c (ARGERR_): Use constants for error values.
28         (optfile_parse): Prettify.  Replace xmalloc and xrealloc by malloc
29         and realloc.
30         * libjnlib-config.h (jnlib_strdup, jnlib_realloc): New.
31
32 2008-06-26  Werner Koch  <wk@g10code.com>
33
34         * stringhelp.c (print_sanitized_buffer2): Loose check for control
35         characters to better cope with utf-8.  The range 0x80..0x9f is
36         nowadays not anymore accidently used for control charaters.
37
38 2008-06-13  Werner Koch  <wk@g10code.com>
39
40         * dotlock.c: Reformat code and implement locking for W32.
41         (create_dotlock): Use snprintf.
42
43 2008-06-11  Werner Koch  <wk@g10code.com>
44
45         * utf8conv.c: Remove useless variable ACTIVE_CHARSET.  Suggested
46         by Petr Uzel.
47
48 2008-05-26  Werner Koch  <wk@g10code.com>
49
50         * argparse.c (usage): Make sure to print a trailing LF for usage(1).
51
52 2008-04-08  Werner Koch  <wk@g10code.com>
53
54         * w32-gettext.c (gettext_select_utf8): New.
55         (get_string): Support switching encodings.
56         (load_domain): Allocate space for DATA_NATIVE.
57
58 2008-03-25  Werner Koch  <wk@g10code.com>
59
60         * w32-gettext.c (_nl_locale_name): New.  Taken from
61         ../common/localename and GNU gettext's localename.c.
62         (set_gettext_file): Rewritten.
63         (gettext_localename): New.
64
65 2008-03-17  Werner Koch  <wk@g10code.com>
66
67         * logging.c (my_funopen_hook_size_t): New.
68         (fun_writer): Use it to cope with fopencookie/funopen differences.
69         * dotlock.c (read_lockfile): Initialize PID.  Reported by St├ęphane
70         Corth├ęsy.
71
72 2008-02-22  Werner Koch  <wk@g10code.com>
73
74         * argparse.c (strusage): Set copyright year to 2008.
75
76 2007-11-19  Werner Koch  <wk@g10code.com>
77
78         * stringhelp.c (percent_escape): Factor code out to
79         (do_percent_escape): .. new.
80         (try_percent_escape): New.
81
82 2007-10-01  Werner Koch  <wk@g10code.com>
83
84         * w32-afunix.c: Only keep the client related code.
85         (read_port_and_nonce): New.  Taken from Assuan.
86         (_w32_sock_connect): Rewritten.
87
88 2007-08-29  Werner Koch  <wk@g10code.com>
89
90         * argparse.c (initialize): Make strings translatable and remove
91         extra LF.
92
93 2007-08-24  Werner Koch  <wk@g10code.com>
94
95         * mischelp.c (same_file_p): New.
96         (libjnlib_dummy_mischelp_func): Remove as we now always have one
97         function.
98
99 2007-08-09  Werner Koch  <wk@g10code.com>
100
101         * argparse.c (show_help): Expand the @EMAIL@ macro in the package
102         bug reporting address.
103
104 2007-08-02  Werner Koch  <wk@g10code.com>
105
106         * t-stringhelp.c (test_compare_filenames): New.
107
108         * stringhelp.c (compare_filenames) [HAVE_DRIVE_LETTERS]: Fixed
109         comparison to take slash and backslash in account.
110         (make_filename): Avoid mixing / and \.
111
112 2007-07-04  Werner Koch  <wk@g10code.com>
113
114         * utf8conv.c (load_libiconv): Remove URL from translatble string.
115
116         Switched JNLIB from LGPLv2.1 to LGPLv3.
117
118 2007-07-01  Werner Koch  <wk@g10code.com>
119
120         * argparse.c (strusage): Use id 10 for the license string;
121         default to GPL3+.  Change long note to version 3 or later.
122         (show_version): Print the license info.
123
124 2007-06-19  Werner Koch  <wk@g10code.com>
125
126         * Makefile.am: Add support for regression tests.
127         * t-support.h, t-support.c: New.
128         * t-stringhelp.c: New.
129
130         * stringhelp.c (percent_escape): Add arg EXTRA to make it a more
131         general function.  Changed all callers.
132
133 2007-06-18  Werner Koch  <wk@g10code.com>
134
135         * w32-afunix.c (_w32_sock_bind): Changed to properly detect an
136         already used socket.
137
138 2007-06-18  Marcus Brinkmann  <marcus@g10code.de>
139
140         * stringhelp.h (percent_escape): New prototype.
141         * stringhelp.c (percent_escape): New function.
142
143 2007-06-11  Werner Koch  <wk@g10code.com>
144
145         * utf8conv.c (jnlib_iconv_open, jnlib_iconv, jnlib_iconv_close): New.
146
147 2007-06-06  Werner Koch  <wk@g10code.com>
148
149         * w32help.h: New.
150         * w32-gettext.c: New.  Taken from gnupg 1.4, added ngettext,
151         changed to use jnlib malloc functions and put under the LGPL.
152         * w32-reg.c: New.  Taken from../common/w32reg.c and changed to
153         LGPL.  Changed API to use the jnlib malloc functions.
154         * Makefile.am (libjnlib_a_SOURCES) [!W32]: Do not build the w32
155         specific modules.
156
157         * dotlock.c: Include stringhelp.h for stpcpy prototype.
158
159 2007-06-04  Werner Koch  <wk@g10code.com>
160
161         * dynload.h: New.  Taken from ../common and changed to LGPL.
162
163         * utf8conv.c (load_libiconv): New.  Taken from GnuPG 1.4
164
165 2007-05-30  Werner Koch  <wk@g10code.com>
166
167         * w32-pth.h, w32-pth.c: Remove.
168
169 2007-04-25  Werner Koch  <wk@g10code.com>
170
171         * argparse.c (long_opt_strlen): Fixed for utf-8.
172
173 2007-03-07  Werner Koch  <wk@g10code.com>
174
175         * argparse.c (strusage): Set copyright year to 2007.
176
177 2007-01-25  Werner Koch  <wk@g10code.com>
178
179         * stringhelp.c (utf8_charcount): New.
180
181 2006-11-29  Werner Koch  <wk@g10code.com>
182
183         * utf8conv.c (set_native_charset) [HAVE_W32_SYSTEM]: Fixed typo in
184         macro name.
185
186 2006-11-15  Werner Koch  <wk@g10code.com>
187
188         * logging.c (my_funopen_hook_ret_t): New.
189         (fun_writer): Use it.
190
191 2006-10-19  Werner Koch  <wk@g10code.com>
192
193         * stringhelp.c (memrchr) [!HAVE_MEMRCHR]: Provide a replacement.
194
195 2006-09-27  Werner Koch  <wk@g10code.com>
196
197         * mischelp.c: New.
198         (timegm): Copied from gnupg 1.4, changed from GPL to LGPL.  Fixed
199         a memory leak.
200
201         * stringhelp.h (isascii): New.
202
203         * stringhelp.c (strsep): New. Copied from gnupg 1.4.5
204         util/strgutil.c.
205
206         * strlist.h (STRLIST): Removed deprecated typedef. 
207
208         * types.h: Made cpp commands work with old compilers.  Also shows
209         up nicer with Emacs' font locking.
210
211         * w32-afunix.c (_w32_sock_connect): Set ERRNO for an invalid port.
212
213         Changed license from GPL to LGPL.  Note that all code has either
214         been written by me, David, employees of g10 Code or taken from
215         glibc.
216         
217         * libjnlib-config.h, stringhelp.c, stringhelp.h:
218         * strlist.c, strlist.h, utf8conv.c, utf8conv.h:
219         * argparse.c, argparse.h, logging.c, logging.h:
220         * dotlock.c, dotlock.h, types.h, mischelp.h:
221         * xmalloc.c, xmalloc.h, w32-pth.c, w32-pth.h:
222         * w32-afunix.c, w32-afunix.h: Tagged them to be long to jnlib
223         which is a part of GnuPG but also used by other projetcs. 
224
225 2006-09-22  Werner Koch  <wk@g10code.com>
226
227         * utf8conv.c: Reworked to match the gnupg 1.4.5 code.  This now
228         requires iconv support but this is reasonable for all modern
229         systems.
230
231 2006-08-29  Werner Koch  <wk@g10code.com>
232
233         * logging.c (do_logv): Emit a missing LF for fatal errors.
234
235 2006-06-28  Werner Koch  <wk@g10code.com>
236
237         * dotlock.c (make_dotlock, release_dotlock, read_lockfile)
238         (maybe_deadlock, destroy_dotlock, create_dotlock): Re-indented.
239         (create_dotlock): Repalces some log_fatal by log_error as it was
240         not intended that they should terminate.  Write the nodename to
241         the locking file. Code cleanups.
242         (read_lockfile): Reworked to read the node name.
243         (make_dotlock): Test for identical node name and delete lock stale
244         file.
245         (release_dotlock): Likewise.
246
247 2006-05-23  Werner Koch  <wk@g10code.com>
248
249         * libjnlib-config.h (JNLIB_NEED_UTF8CONV): Fixed typo in name.
250
251         * dotlock.c (release_dotlock): Don't act if we don't have any
252         locks at all.
253         (destroy_dotlock): New.  From 1.4.3.
254         (dotlock_remove_lockfiles): Make use of destroy function.
255
256 2006-05-19  Werner Koch  <wk@g10code.com>
257
258         * strlist.c (append_to_strlist2): Enabled.
259
260         * stringhelp.c (print_sanitized_buffer2): New.  Changed the rules
261         to match the behaviour of print_string2 from gnupg 1.4.3.
262         (print_sanitized_buffer): Use the new function.
263         (print_sanitized_string2): New.
264         (hextobyte): New.  Taken from gpg 1.4.3.
265
266 2006-04-28  Werner Koch  <wk@g10code.com>
267
268         * stringhelp.c (print_sanitized_buffer): Fix bug where the count
269         got wrong for the \xNN representation.
270         (sanitize_buffer): Fix bug where some control characters lose part
271         of their \xNN representation.
272
273 2006-04-20  Werner Koch  <wk@g10code.com>
274
275         * stringhelp.c (make_basename): New arg INPUTPATH for future
276         riscos compatibility.
277
278 2006-04-18  Werner Koch  <wk@g10code.com>
279
280         * libjnlib-config.h (JNLIB_NEED_UTF8CONF): Defined.
281         * strlist.c (add_to_strlist2) [JNLIB_NEED_UTF8CONV]: Enabled.
282
283 2005-06-15  Werner Koch  <wk@g10code.com>
284
285         * stringhelp.c (sanitize_buffer): Make P a void*.
286         (ascii_memistr, memistr): Ditto.
287         (ascii_memcasecmp): Ditto.
288         * logging.c (writen): Use void * for arg BUFFER.
289         * stringhelp.c (memistr): Fixed unsigned/signed pointer conflict.
290         (ascii_memistr): Ditto.
291         (ascii_memcasemem): Ditto.
292         * utf8conv.c (utf8_to_native): Ditto.
293         (utf8_to_native): Ditto.
294         * argparse.c (show_version): Removed non-required cast.
295
296 2005-01-19  Werner Koch  <wk@g10code.com>
297
298         * logging.c (fun_writer): Don't fallback to stderr. Print to
299         stderr only if connected to a tty.
300
301 2004-12-20  Werner Koch  <wk@g10code.com>
302
303         * w32-pth.c (do_pth_event_free): The events are hold in a ring
304         buffer.  Adjust for that.
305         (do_pth_event_body): Ditto.
306         (pth_event_isolate): Ditto.
307         (do_pth_wait): Ditto.
308         (_pth_event_count): Renamed to ..
309         (event_count): .. and adjusted as above.
310         (pth_init): Define 3 debug levels and change all debug calls to
311         make use of them.  This makes the moule now silent.
312
313 2004-12-19  Werner Koch  <wk@g10code.com>
314
315         * w32-pth.c (pth_init): Enable debugging depending on env var.
316         (pth_self): New.
317         (pth_mutex_release, pth_mutex_acquire): Implemented directly using
318         the W32 API.
319
320 2004-12-18  Werner Koch  <wk@g10code.com>
321
322         * w32-pth.c (pth_init): Reverse return values.  Use TRUE and FALSE
323         constants.
324         (pth_kill, pth_mutex_acquire, pth_attr_set, pth_join, pth_cancel):
325         Ditto.
326
327 2004-12-15  Werner Koch  <wk@g10code.com>
328
329         * logging.c [W32]: Don't include unavailable headers.
330
331 2004-12-14  Werner Koch  <wk@g10code.com>
332
333         * w32-pth.c (_pth_strerror): Renamed to ...
334         (w32_strerror): .. this. And let callers provide a buffer.
335         (spawn_helper_thread): Removed HD arg and hardwire the stack size
336         to 32k.
337         (do_pth_wait): Removed use of ATTR; not needed for the helper
338         threads.
339         (helper_thread): Renamed to ..
340         (launch_thread): .. this.  Release handle if not joinable.
341         (struct pth_priv_hd_s): Renamed to ...
342         (struct thread_info_s): .. this.  Add member JOINABLE and TH.
343
344 2004-12-14  Timo Schulz  <twoaday@g10code.com>
345
346         * w32-pth.c (pth_kill): Just release the crit section if
347         pth_init was really called. And set all handles to NULL.
348         (_pth_strerror): New.
349         (do_pth_wait): Before we enter the loop we check if there
350         are too much events in the ring.
351         
352 2004-12-14  Werner Koch  <wk@g10code.com>
353
354         * w32-pth.h (pth_event_occured): Removed macro. 
355         * w32-pth.c: Fixed license statement; its under the LGPL.
356         (enter_pth, leave_pth): Use them to bracket almost all public
357         functions.
358
359 2004-12-13  Timo Schulz  <twoaday@g10code.com>
360
361         * w32-pth.c (enter_pth, leave_pth): New.
362         (pth_init): Initialize global mutex section.
363         (pth_kill): Release global mutex section.
364         (helper_thread): New.
365         (pth_spawn): Make sure only one thread is running.
366         
367 2004-12-13  Werner Koch  <wk@g10code.com>
368
369         * stringhelp.c (w32_strerror) [W32]: New.
370
371         * w32-pth.c, w32-pth.h: Added real code written by Timo Schulz.
372         Not finished, though.
373
374 2004-12-07  Werner Koch  <wk@g10code.com>
375
376         * w32-pth.c, w32-pth.h: New.
377
378 2004-11-26  Werner Koch  <wk@g10code.com>
379
380         * logging.c [_WIN32]: Don't include socket headers.
381
382 2004-11-30  Timo Schulz  <ts@g10code.com>
383
384         * w32-afunix.c: New. AF_UNIX emulation for W32.
385         * w32-afunix.h: Likewise.
386         
387 2004-11-22  Werner Koch  <wk@g10code.com>
388
389         * logging.c (log_test_fd): Add test on LOGSTREAM.  Reported by
390         Barry Schwartz.
391
392 2004-11-18  Werner Koch  <wk@g10code.com>
393
394         * logging.c: Explicitly include sys/stat.h for the S_I* constants.
395
396 2004-10-21  Werner Koch  <wk@g10code.com>
397
398         * logging.c (do_logv): Use set_log_stream to setup a default.
399         (log_set_file): Factored code out to ..
400         (set_file_fd): .. New function to allow using a file descriptor.
401         (log_set_fd): Make use of new fucntion.
402         (fun_writer): Reworked.
403
404 2004-08-18  Werner Koch  <wk@g10code.de>
405
406         * stringhelp.c (print_sanitized_utf8_string): Actually implement
407         it.
408
409 2004-06-21  Werner Koch  <wk@g10code.com>
410
411         * logging.c (log_set_file): Do not close an old logstream if it
412         used to be stderr or stdout.
413
414 2004-05-05  Werner Koch  <wk@gnupg.org>
415
416         * logging.c (log_set_file): Oops, don't close if LOGSTREAM is NULL.
417
418 2004-04-30  Werner Koch  <wk@gnupg.org>
419
420         * logging.c (log_set_file): Make sure the log stream will be
421         closed even if the stderr fileno will be assigned to a new socket.
422
423 2004-04-16  Werner Koch  <wk@gnupg.org>
424
425         * logging.h (JNLIB_LOG_WITH_PREFIX): Add constants for the flag
426         values.
427         * logging.c (log_set_prefix): New flag DETACHED.
428         (fun_writer): Take care of this flag.
429         (log_test_fd): New.
430
431 2004-02-18  Werner Koch  <wk@gnupg.org>
432
433         * stringhelp.c (print_sanitized_buffer): Don't care about
434         non-ASCII characaters.
435         (sanitize_buffer): Ditto.
436
437 2004-02-12  Werner Koch  <wk@gnupg.org>
438
439         * Makefile.am: Replaced INCLUDES by AM_CPPFLAGS.
440
441 2004-01-05  Werner Koch  <wk@gnupg.org>
442
443         * argparse.c (strusage): Changed default copyright year to 2004.
444
445 2003-12-17  Werner Koch  <wk@gnupg.org>
446
447         * argparse.c (initialize): Replaced use of non-literal format
448         args.  Suggested by Florian Weimer.
449
450 2003-12-16  Werner Koch  <wk@gnupg.org>
451
452         * logging.c (writen, fun_writer, fun_closer): New.
453         (log_set_file): Add feature to log to a socket.
454         (log_set_file, do_logv): Force printing with prefix and pid.
455
456 2003-11-13  Werner Koch  <wk@gnupg.org>
457
458         * strlist.c (strlist_copy): New.
459
460         * dotlock.c: Define DIRSEP_C et al. if not defined.
461
462 2003-11-06  Werner Koch  <wk@gnupg.org>
463
464         * strlist.h (strlist_t): New. STRLIST is now deprecated.
465
466 2003-06-18  Werner Koch  <wk@gnupg.org>
467
468         * strlist.c (strlist_pop): New.
469
470         * dotlock.c (dotlock_remove_lockfiles): Prefixed with dotlock_ and
471         made global.
472
473 2003-06-17  Werner Koch  <wk@gnupg.org>
474
475         * stringhelp.c (length_sans_trailing_chars)
476         (length_sans_trailing_ws): New.
477
478         * logging.c (log_inc_errorcount): New.
479
480         * stringhelp.c (print_sanitized_utf8_buffer): Implement utf8
481         conversion.
482         (sanitize_buffer): New. Based on gnupg 1.3.2 make_printable_string.
483
484         * dotlock.c: Updated to match the version from 1.3.2
485         * utf8conv.c: New.  Code taken from strgutil.c of gnupg 1.3.2.
486         * utf8conv.h: New.
487
488 2003-06-16  Werner Koch  <wk@gnupg.org>
489
490         * logging.c (do_logv): Hack to optionally suppress a leading space.
491
492         * stringhelp.c (ascii_strncasecmp): New.  Taken from gnupg 1.3.
493         (ascii_memistr): New. Taken from gnupg 1.3
494
495 2003-06-13  Werner Koch  <wk@gnupg.org>
496
497         * mischelp.h (wipememory2,wipememory): New. Taken from GnuPG 1.3.2. 
498
499 2002-06-04  Werner Koch  <wk@gnupg.org>
500
501         * stringhelp.c (print_sanitized_utf8_string): New.  No real
502         implementation for now.
503         (print_sanitized_utf8_buffer): Ditto.
504
505 2002-04-04  Werner Koch  <wk@gnupg.org>
506
507         * logging.c (log_get_prefix): New.
508
509 2002-03-15  Werner Koch  <wk@gnupg.org>
510
511         * argparse.c (optfile_parse): Fixed missing argument handling.
512
513 2002-02-25  Werner Koch  <wk@gnupg.org>
514
515         * stringhelp.c (ascii_memcasemem): New.
516
517 2002-02-14  Werner Koch  <wk@gnupg.org>
518
519         * Makefile.am (INCLUDES): Add cflags for libgcrypt.
520
521 2002-02-07  Werner Koch  <wk@gnupg.org>
522
523         * logging.c (log_set_fd): New.
524
525         * stringhelp.c (print_sanitized_buffer): New.
526         (print_sanitized_string): New.
527
528 2002-01-24  Werner Koch  <wk@gnupg.org>
529
530         * argparse.c (strusage): Set default copyright notice year to 2002.
531
532         Fixed the copyright notice of this file, as it has always been
533         part of GnuPG and therefore belongs to the FSF.
534
535 2001-11-01  Marcus Brinkmann  <marcus@g10code.de>
536
537         * logging.c (log_printf): Do not initialize ARG_PTR with 0, we
538         don't know the correct type.  Instead, run va_start and va_end
539         unconditionally.
540         Reported by Jose Carlos Garcia Sogo <jsogo@debian.org>.
541
542 2002-01-19  Werner Koch  <wk@gnupg.org>
543
544         * logging.c (log_get_stream): New.
545
546 2001-12-05  Werner Koch  <wk@gnupg.org>
547
548         * logging.c (log_set_prefix): New.
549         (do_logv): Include prefix and pid only if enabled. Print time only
550         when explicitly enabled.
551         (log_logv): New.  
552         * logging.h: Include log_logv() only when requested.
553
554 2001-11-06  Werner Koch  <wk@gnupg.org>
555
556         * strlist.c, strlist.h: New. Taken from pgnupg/util/strgutil.c
557
558 2001-08-30  Werner Koch  <wk@gnupg.org>
559
560         * logging.c (log_printf): Don't pass NULL instead of arg_ptr.
561
562 2001-07-19  Werner Koch  <wk@gnupg.org>
563
564         * stringhelp.c (ascii_memistr,ascii_isupper,ascii_islower,
565         ascii_toupper,ascii_tolower, ascii_strcasecmp, ascii_memcasecmp): New.
566
567 2000-07-26 10:02:51  Werner Koch  (wk@habibti.openit.de)
568
569         * stringhelp.c.: Add stdarg.h
570         * argparse.h: s/ulong/unsigned long/ although this should be defined
571         by types.h.
572
573 2000-06-28 19:40:23  Werner Koch  (wk@habibti.openit.de)
574
575         * Makefile.am: Replaced second logging.c by .h
576
577 2000-05-24 08:58:15  Werner Koch  (wk@habibti.openit.de)
578
579         * logging.c (log_get_errorcount): New.
580
581 2000-05-24 08:44:47  Werner Koch  (wk@habibti.openit.de)
582
583         * stringhelp.c: Added a few filename related helper functions.
584
585 2000-05-11 18:04:43  Werner Koch  (wk@habibti.openit.de)
586
587         * xmalloc.c (xstrcat2): Replaced stpcpy to quickly address W32
588         problems.
589
590 2000-05-02 19:43:38  Werner Koch  (wk@habibti.openit.de)
591
592         * xmalloc.c (xstrcat2): New.
593
594 Mon Jan 24 13:04:28 CET 2000  Werner Koch  <wk@gnupg.de>
595
596         * README: New.
597         * Makefile.am: new.
598         * argparse.c, argparse.h, logging.c, logging.h:
599         * mischelp.h, stringhelp.c, stringhelp.h, xmalloc.c:
600         * xmalloc.h, dotlock.c: Moved from ../util to here.
601         * dotlock.h: New.
602         * libjnlib-config.h: New.
603
604         * logging.c (log_set_file): New.
605         (log_printf): New.
606         (do_logv): Add kludge to insert LFs.
607
608
609      ***********************************************************
610      * Please note that JNLIB is maintained as part of GnuPG.  *
611      * You may find it source-copied in other packages.        *
612      ***********************************************************        
613         
614  Copyright 2000, 2001, 2002, 2003, 2004,
615            2005, 2006, 2007, 2008 Free Software Foundation, Inc.
616
617  This file is free software; as a special exception the author gives
618  unlimited permission to copy and/or distribute it, with or without
619  modifications, as long as this notice is preserved.
620
621  This file is distributed in the hope that it will be useful, but
622  WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
623  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.