Revision 33797

View differences:

tags/v2_0_0_Build_2020/libraries/libjni-potrace/src/main/native/jpotrace/getopt.c
1
/* Getopt for GNU.
2
   NOTE: getopt is now part of the C library, so if you don't know what
3
   "Keep this file name-space clean" means, talk to drepper@gnu.org
4
   before changing it!
5

  
6
   Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
7
   	Free Software Foundation, Inc.
8

  
9
   The GNU C Library is free software; you can redistribute it and/or
10
   modify it under the terms of the GNU Library General Public License as
11
   published by the Free Software Foundation; either version 2 of the
12
   License, or (at your option) any later version.
13

  
14
   The GNU C Library is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
   Library General Public License for more details.
18

  
19
   You should have received a copy of the GNU Library General Public
20
   License along with the GNU C Library; see the file COPYING.LIB.  If not,
21
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22
   Boston, MA 02111-1307, USA.  */
23

24
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
25
   Ditto for AIX 3.2 and <stdlib.h>.  */
26
#ifndef _NO_PROTO
27
# define _NO_PROTO
28
#endif
29

  
30
#ifdef HAVE_CONFIG_H
31
# include "config.h"
32
#endif
33

  
34
#if !defined __STDC__ || !__STDC__
35
/* This is a separate conditional since some stdc systems
36
   reject `defined (const)'.  */
37
# ifndef const
38
#  define const
39
# endif
40
#endif
41

  
42
#include <stdio.h>
43

  
44
/* Comment out all this code if we are using the GNU C Library, and are not
45
   actually compiling the library itself.  This code is part of the GNU C
46
   Library, but also included in many other GNU distributions.  Compiling
47
   and linking in this code is a waste when using the GNU C library
48
   (especially if it is a shared library).  Rather than having every GNU
49
   program understand `configure --with-gnu-libc' and omit the object files,
50
   it is simpler to just do this in the source for each such file.  */
51

  
52
#define GETOPT_INTERFACE_VERSION 2
53
#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
54
# include <gnu-versions.h>
55
# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
56
#  define ELIDE_CODE
57
# endif
58
#endif
59

  
60
#ifndef ELIDE_CODE
61

  
62

  
63
/* This needs to come after some library #include
64
   to get __GNU_LIBRARY__ defined.  */
65
#ifdef	__GNU_LIBRARY__
66
/* Don't include stdlib.h for non-GNU C libraries because some of them
67
   contain conflicting prototypes for getopt.  */
68
# include <stdlib.h>
69
# include <unistd.h>
70
#endif	/* GNU C library.  */
71

  
72
#ifdef VMS
73
# include <unixlib.h>
74
# if HAVE_STRING_H - 0
75
#  include <string.h>
76
# endif
77
#endif
78

  
79
#ifndef _
80
/* This is for other GNU distributions with internationalized messages.  */
81
# if defined HAVE_LIBINTL_H || defined _LIBC
82
#  include <libintl.h>
83
#  ifndef _
84
#   define _(msgid)	gettext (msgid)
85
#  endif
86
# else
87
#  define _(msgid)	(msgid)
88
# endif
89
#endif
90

  
91
/* This version of `getopt' appears to the caller like standard Unix `getopt'
92
   but it behaves differently for the user, since it allows the user
93
   to intersperse the options with the other arguments.
94

  
95
   As `getopt' works, it permutes the elements of ARGV so that,
96
   when it is done, all the options precede everything else.  Thus
97
   all application programs are extended to handle flexible argument order.
98

  
99
   Setting the environment variable POSIXLY_CORRECT disables permutation.
100
   Then the behavior is completely standard.
101

  
102
   GNU application programs can use a third alternative mode in which
103
   they can distinguish the relative order of options and other arguments.  */
104

  
105
#include "getopt.h"
106

  
107
/* For communication from `getopt' to the caller.
108
   When `getopt' finds an option that takes an argument,
109
   the argument value is returned here.
110
   Also, when `ordering' is RETURN_IN_ORDER,
111
   each non-option ARGV-element is returned here.  */
112

  
113
char *optarg;
114

  
115
/* Index in ARGV of the next element to be scanned.
116
   This is used for communication to and from the caller
117
   and for communication between successive calls to `getopt'.
118

  
119
   On entry to `getopt', zero means this is the first call; initialize.
120

  
121
   When `getopt' returns -1, this is the index of the first of the
122
   non-option elements that the caller should itself scan.
123

  
124
   Otherwise, `optind' communicates from one call to the next
125
   how much of ARGV has been scanned so far.  */
126

  
127
/* 1003.2 says this must be 1 before any call.  */
128
int optind = 1;
129

  
130
/* Formerly, initialization of getopt depended on optind==0, which
131
   causes problems with re-calling getopt as programs generally don't
132
   know that. */
133

  
134
int __getopt_initialized;
135

  
136
/* The next char to be scanned in the option-element
137
   in which the last option character we returned was found.
138
   This allows us to pick up the scan where we left off.
139

  
140
   If this is zero, or a null string, it means resume the scan
141
   by advancing to the next ARGV-element.  */
142

  
143
static char *nextchar;
144

  
145
/* Callers store zero here to inhibit the error message
146
   for unrecognized options.  */
147

  
148
int opterr = 1;
149

  
150
/* Set to an option character which was unrecognized.
151
   This must be initialized on some systems to avoid linking in the
152
   system's own getopt implementation.  */
153

  
154
int optopt = '?';
155

  
156
/* Describe how to deal with options that follow non-option ARGV-elements.
157

  
158
   If the caller did not specify anything,
159
   the default is REQUIRE_ORDER if the environment variable
160
   POSIXLY_CORRECT is defined, PERMUTE otherwise.
161

  
162
   REQUIRE_ORDER means don't recognize them as options;
163
   stop option processing when the first non-option is seen.
164
   This is what Unix does.
165
   This mode of operation is selected by either setting the environment
166
   variable POSIXLY_CORRECT, or using `+' as the first character
167
   of the list of option characters.
168

  
169
   PERMUTE is the default.  We permute the contents of ARGV as we scan,
170
   so that eventually all the non-options are at the end.  This allows options
171
   to be given in any order, even with programs that were not written to
172
   expect this.
173

  
174
   RETURN_IN_ORDER is an option available to programs that were written
175
   to expect options and other ARGV-elements in any order and that care about
176
   the ordering of the two.  We describe each non-option ARGV-element
177
   as if it were the argument of an option with character code 1.
178
   Using `-' as the first character of the list of option characters
179
   selects this mode of operation.
180

  
181
   The special argument `--' forces an end of option-scanning regardless
182
   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
183
   `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
184

  
185
static enum
186
{
187
  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
188
} ordering;
189

  
190
/* Value of POSIXLY_CORRECT environment variable.  */
191
static char *posixly_correct;
192

193
#ifdef	__GNU_LIBRARY__
194
/* We want to avoid inclusion of string.h with non-GNU libraries
195
   because there are many ways it can cause trouble.
196
   On some systems, it contains special magic macros that don't work
197
   in GCC.  */
198
# include <string.h>
199
# define my_index	strchr
200
#else
201

  
202
# if HAVE_STRING_H
203
#  include <string.h>
204
# else
205
#  include <strings.h>
206
# endif
207

  
208
/* Avoid depending on library functions or files
209
   whose names are inconsistent.  */
210

  
211
#ifndef getenv
212
extern char *getenv ();
213
#endif
214

  
215
static char *
216
my_index (str, chr)
217
     const char *str;
218
     int chr;
219
{
220
  while (*str)
221
    {
222
      if (*str == chr)
223
	return (char *) str;
224
      str++;
225
    }
226
  return 0;
227
}
228

  
229
/* If using GCC, we can safely declare strlen this way.
230
   If not using GCC, it is ok not to declare it.  */
231
#ifdef __GNUC__
232
/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
233
   That was relevant to code that was here before.  */
234
# if (!defined __STDC__ || !__STDC__) && !defined strlen
235
/* gcc with -traditional declares the built-in strlen to return int,
236
   and has done so at least since version 2.4.5. -- rms.  */
237
extern int strlen (const char *);
238
# endif /* not __STDC__ */
239
#endif /* __GNUC__ */
240

  
241
#endif /* not __GNU_LIBRARY__ */
242

243
/* Handle permutation of arguments.  */
244

  
245
/* Describe the part of ARGV that contains non-options that have
246
   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
247
   `last_nonopt' is the index after the last of them.  */
248

  
249
static int first_nonopt;
250
static int last_nonopt;
251

  
252
#ifdef _LIBC
253
/* Bash 2.0 gives us an environment variable containing flags
254
   indicating ARGV elements that should not be considered arguments.  */
255

  
256
/* Defined in getopt_init.c  */
257
extern char *__getopt_nonoption_flags;
258

  
259
static int nonoption_flags_max_len;
260
static int nonoption_flags_len;
261

  
262
static int original_argc;
263
static char *const *original_argv;
264

  
265
/* Make sure the environment variable bash 2.0 puts in the environment
266
   is valid for the getopt call we must make sure that the ARGV passed
267
   to getopt is that one passed to the process.  */
268
static void
269
__attribute__ ((unused))
270
store_args_and_env (int argc, char *const *argv)
271
{
272
  /* XXX This is no good solution.  We should rather copy the args so
273
     that we can compare them later.  But we must not use malloc(3).  */
274
  original_argc = argc;
275
  original_argv = argv;
276
}
277
# ifdef text_set_element
278
text_set_element (__libc_subinit, store_args_and_env);
279
# endif /* text_set_element */
280

  
281
# define SWAP_FLAGS(ch1, ch2) \
282
  if (nonoption_flags_len > 0)						      \
283
    {									      \
284
      char __tmp = __getopt_nonoption_flags[ch1];			      \
285
      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
286
      __getopt_nonoption_flags[ch2] = __tmp;				      \
287
    }
288
#else	/* !_LIBC */
289
# define SWAP_FLAGS(ch1, ch2)
290
#endif	/* _LIBC */
291

  
292
/* Exchange two adjacent subsequences of ARGV.
293
   One subsequence is elements [first_nonopt,last_nonopt)
294
   which contains all the non-options that have been skipped so far.
295
   The other is elements [last_nonopt,optind), which contains all
296
   the options processed since those non-options were skipped.
297

  
298
   `first_nonopt' and `last_nonopt' are relocated so that they describe
299
   the new indices of the non-options in ARGV after they are moved.  */
300

  
301
#if defined __STDC__ && __STDC__
302
static void exchange (char **);
303
#endif
304

  
305
static void
306
exchange (argv)
307
     char **argv;
308
{
309
  int bottom = first_nonopt;
310
  int middle = last_nonopt;
311
  int top = optind;
312
  char *tem;
313

  
314
  /* Exchange the shorter segment with the far end of the longer segment.
315
     That puts the shorter segment into the right place.
316
     It leaves the longer segment in the right place overall,
317
     but it consists of two parts that need to be swapped next.  */
318

  
319
#ifdef _LIBC
320
  /* First make sure the handling of the `__getopt_nonoption_flags'
321
     string can work normally.  Our top argument must be in the range
322
     of the string.  */
323
  if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
324
    {
325
      /* We must extend the array.  The user plays games with us and
326
	 presents new arguments.  */
327
      char *new_str = malloc (top + 1);
328
      if (new_str == NULL)
329
	nonoption_flags_len = nonoption_flags_max_len = 0;
330
      else
331
	{
332
	  memset (__mempcpy (new_str, __getopt_nonoption_flags,
333
			     nonoption_flags_max_len),
334
		  '\0', top + 1 - nonoption_flags_max_len);
335
	  nonoption_flags_max_len = top + 1;
336
	  __getopt_nonoption_flags = new_str;
337
	}
338
    }
339
#endif
340

  
341
  while (top > middle && middle > bottom)
342
    {
343
      if (top - middle > middle - bottom)
344
	{
345
	  /* Bottom segment is the short one.  */
346
	  int len = middle - bottom;
347
	  register int i;
348

  
349
	  /* Swap it with the top part of the top segment.  */
350
	  for (i = 0; i < len; i++)
351
	    {
352
	      tem = argv[bottom + i];
353
	      argv[bottom + i] = argv[top - (middle - bottom) + i];
354
	      argv[top - (middle - bottom) + i] = tem;
355
	      SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
356
	    }
357
	  /* Exclude the moved bottom segment from further swapping.  */
358
	  top -= len;
359
	}
360
      else
361
	{
362
	  /* Top segment is the short one.  */
363
	  int len = top - middle;
364
	  register int i;
365

  
366
	  /* Swap it with the bottom part of the bottom segment.  */
367
	  for (i = 0; i < len; i++)
368
	    {
369
	      tem = argv[bottom + i];
370
	      argv[bottom + i] = argv[middle + i];
371
	      argv[middle + i] = tem;
372
	      SWAP_FLAGS (bottom + i, middle + i);
373
	    }
374
	  /* Exclude the moved top segment from further swapping.  */
375
	  bottom += len;
376
	}
377
    }
378

  
379
  /* Update records for the slots the non-options now occupy.  */
380

  
381
  first_nonopt += (optind - last_nonopt);
382
  last_nonopt = optind;
383
}
384

  
385
/* Initialize the internal data when the first call is made.  */
386

  
387
#if defined __STDC__ && __STDC__
388
static const char *_getopt_initialize (int, char *const *, const char *);
389
#endif
390
static const char *
391
_getopt_initialize (argc, argv, optstring)
392
     int argc;
393
     char *const *argv;
394
     const char *optstring;
395
{
396
  /* Start processing options with ARGV-element 1 (since ARGV-element 0
397
     is the program name); the sequence of previously skipped
398
     non-option ARGV-elements is empty.  */
399

  
400
  first_nonopt = last_nonopt = optind;
401

  
402
  nextchar = NULL;
403

  
404
  posixly_correct = getenv ("POSIXLY_CORRECT");
405

  
406
  /* Determine how to handle the ordering of options and nonoptions.  */
407

  
408
  if (optstring[0] == '-')
409
    {
410
      ordering = RETURN_IN_ORDER;
411
      ++optstring;
412
    }
413
  else if (optstring[0] == '+')
414
    {
415
      ordering = REQUIRE_ORDER;
416
      ++optstring;
417
    }
418
  else if (posixly_correct != NULL)
419
    ordering = REQUIRE_ORDER;
420
  else
421
    ordering = PERMUTE;
422

  
423
#ifdef _LIBC
424
  if (posixly_correct == NULL
425
      && argc == original_argc && argv == original_argv)
426
    {
427
      if (nonoption_flags_max_len == 0)
428
	{
429
	  if (__getopt_nonoption_flags == NULL
430
	      || __getopt_nonoption_flags[0] == '\0')
431
	    nonoption_flags_max_len = -1;
432
	  else
433
	    {
434
	      const char *orig_str = __getopt_nonoption_flags;
435
	      int len = nonoption_flags_max_len = strlen (orig_str);
436
	      if (nonoption_flags_max_len < argc)
437
		nonoption_flags_max_len = argc;
438
	      __getopt_nonoption_flags =
439
		(char *) malloc (nonoption_flags_max_len);
440
	      if (__getopt_nonoption_flags == NULL)
441
		nonoption_flags_max_len = -1;
442
	      else
443
		memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
444
			'\0', nonoption_flags_max_len - len);
445
	    }
446
	}
447
      nonoption_flags_len = nonoption_flags_max_len;
448
    }
449
  else
450
    nonoption_flags_len = 0;
451
#endif
452

  
453
  return optstring;
454
}
455

456
/* Scan elements of ARGV (whose length is ARGC) for option characters
457
   given in OPTSTRING.
458

  
459
   If an element of ARGV starts with '-', and is not exactly "-" or "--",
460
   then it is an option element.  The characters of this element
461
   (aside from the initial '-') are option characters.  If `getopt'
462
   is called repeatedly, it returns successively each of the option characters
463
   from each of the option elements.
464

  
465
   If `getopt' finds another option character, it returns that character,
466
   updating `optind' and `nextchar' so that the next call to `getopt' can
467
   resume the scan with the following option character or ARGV-element.
468

  
469
   If there are no more option characters, `getopt' returns -1.
470
   Then `optind' is the index in ARGV of the first ARGV-element
471
   that is not an option.  (The ARGV-elements have been permuted
472
   so that those that are not options now come last.)
473

  
474
   OPTSTRING is a string containing the legitimate option characters.
475
   If an option character is seen that is not listed in OPTSTRING,
476
   return '?' after printing an error message.  If you set `opterr' to
477
   zero, the error message is suppressed but we still return '?'.
478

  
479
   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
480
   so the following text in the same ARGV-element, or the text of the following
481
   ARGV-element, is returned in `optarg'.  Two colons mean an option that
482
   wants an optional arg; if there is text in the current ARGV-element,
483
   it is returned in `optarg', otherwise `optarg' is set to zero.
484

  
485
   If OPTSTRING starts with `-' or `+', it requests different methods of
486
   handling the non-option ARGV-elements.
487
   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
488

  
489
   Long-named options begin with `--' instead of `-'.
490
   Their names may be abbreviated as long as the abbreviation is unique
491
   or is an exact match for some defined option.  If they have an
492
   argument, it follows the option name in the same ARGV-element, separated
493
   from the option name by a `=', or else the in next ARGV-element.
494
   When `getopt' finds a long-named option, it returns 0 if that option's
495
   `flag' field is nonzero, the value of the option's `val' field
496
   if the `flag' field is zero.
497

  
498
   The elements of ARGV aren't really const, because we permute them.
499
   But we pretend they're const in the prototype to be compatible
500
   with other systems.
501

  
502
   LONGOPTS is a vector of `struct option' terminated by an
503
   element containing a name which is zero.
504

  
505
   LONGIND returns the index in LONGOPT of the long-named option found.
506
   It is only valid when a long-named option has been found by the most
507
   recent call.
508

  
509
   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
510
   long-named options.  */
511

  
512
int
513
_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
514
     int argc;
515
     char *const *argv;
516
     const char *optstring;
517
     const struct option *longopts;
518
     int *longind;
519
     int long_only;
520
{
521
  int print_errors = opterr;
522
  if (optstring[0] == ':')
523
    print_errors = 0;
524

  
525
  if (argc < 1)
526
    return -1;
527

  
528
  optarg = NULL;
529

  
530
  if (optind == 0 || !__getopt_initialized)
531
    {
532
      if (optind == 0)
533
	optind = 1;	/* Don't scan ARGV[0], the program name.  */
534
      optstring = _getopt_initialize (argc, argv, optstring);
535
      __getopt_initialized = 1;
536
    }
537

  
538
  /* Test whether ARGV[optind] points to a non-option argument.
539
     Either it does not have option syntax, or there is an environment flag
540
     from the shell indicating it is not an option.  The later information
541
     is only used when the used in the GNU libc.  */
542
#ifdef _LIBC
543
# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'	      \
544
		      || (optind < nonoption_flags_len			      \
545
			  && __getopt_nonoption_flags[optind] == '1'))
546
#else
547
# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
548
#endif
549

  
550
  if (nextchar == NULL || *nextchar == '\0')
551
    {
552
      /* Advance to the next ARGV-element.  */
553

  
554
      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
555
	 moved back by the user (who may also have changed the arguments).  */
556
      if (last_nonopt > optind)
557
	last_nonopt = optind;
558
      if (first_nonopt > optind)
559
	first_nonopt = optind;
560

  
561
      if (ordering == PERMUTE)
562
	{
563
	  /* If we have just processed some options following some non-options,
564
	     exchange them so that the options come first.  */
565

  
566
	  if (first_nonopt != last_nonopt && last_nonopt != optind)
567
	    exchange ((char **) argv);
568
	  else if (last_nonopt != optind)
569
	    first_nonopt = optind;
570

  
571
	  /* Skip any additional non-options
572
	     and extend the range of non-options previously skipped.  */
573

  
574
	  while (optind < argc && NONOPTION_P)
575
	    optind++;
576
	  last_nonopt = optind;
577
	}
578

  
579
      /* The special ARGV-element `--' means premature end of options.
580
	 Skip it like a null option,
581
	 then exchange with previous non-options as if it were an option,
582
	 then skip everything else like a non-option.  */
583

  
584
      if (optind != argc && !strcmp (argv[optind], "--"))
585
	{
586
	  optind++;
587

  
588
	  if (first_nonopt != last_nonopt && last_nonopt != optind)
589
	    exchange ((char **) argv);
590
	  else if (first_nonopt == last_nonopt)
591
	    first_nonopt = optind;
592
	  last_nonopt = argc;
593

  
594
	  optind = argc;
595
	}
596

  
597
      /* If we have done all the ARGV-elements, stop the scan
598
	 and back over any non-options that we skipped and permuted.  */
599

  
600
      if (optind == argc)
601
	{
602
	  /* Set the next-arg-index to point at the non-options
603
	     that we previously skipped, so the caller will digest them.  */
604
	  if (first_nonopt != last_nonopt)
605
	    optind = first_nonopt;
606
	  return -1;
607
	}
608

  
609
      /* If we have come to a non-option and did not permute it,
610
	 either stop the scan or describe it to the caller and pass it by.  */
611

  
612
      if (NONOPTION_P)
613
	{
614
	  if (ordering == REQUIRE_ORDER)
615
	    return -1;
616
	  optarg = argv[optind++];
617
	  return 1;
618
	}
619

  
620
      /* We have found another option-ARGV-element.
621
	 Skip the initial punctuation.  */
622

  
623
      nextchar = (argv[optind] + 1
624
		  + (longopts != NULL && argv[optind][1] == '-'));
625
    }
626

  
627
  /* Decode the current option-ARGV-element.  */
628

  
629
  /* Check whether the ARGV-element is a long option.
630

  
631
     If long_only and the ARGV-element has the form "-f", where f is
632
     a valid short option, don't consider it an abbreviated form of
633
     a long option that starts with f.  Otherwise there would be no
634
     way to give the -f short option.
635

  
636
     On the other hand, if there's a long option "fubar" and
637
     the ARGV-element is "-fu", do consider that an abbreviation of
638
     the long option, just like "--fu", and not "-f" with arg "u".
639

  
640
     This distinction seems to be the most useful approach.  */
641

  
642
  if (longopts != NULL
643
      && (argv[optind][1] == '-'
644
	  || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
645
    {
646
      char *nameend;
647
      const struct option *p;
648
      const struct option *pfound = NULL;
649
      int exact = 0;
650
      int ambig = 0;
651
      int indfound = -1;
652
      int option_index;
653

  
654
      for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
655
	/* Do nothing.  */ ;
656

  
657
      /* Test all long options for either exact match
658
	 or abbreviated matches.  */
659
      for (p = longopts, option_index = 0; p->name; p++, option_index++)
660
	if (!strncmp (p->name, nextchar, nameend - nextchar))
661
	  {
662
	    if ((unsigned int) (nameend - nextchar)
663
		== (unsigned int) strlen (p->name))
664
	      {
665
		/* Exact match found.  */
666
		pfound = p;
667
		indfound = option_index;
668
		exact = 1;
669
		break;
670
	      }
671
	    else if (pfound == NULL)
672
	      {
673
		/* First nonexact match found.  */
674
		pfound = p;
675
		indfound = option_index;
676
	      }
677
	    else if (long_only
678
		     || pfound->has_arg != p->has_arg
679
		     || pfound->flag != p->flag
680
		     || pfound->val != p->val)
681
	      /* Second or later nonexact match found.  */
682
	      ambig = 1;
683
	  }
684

  
685
      if (ambig && !exact)
686
	{
687
	  if (print_errors)
688
	    fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
689
		     argv[0], argv[optind]);
690
	  nextchar += strlen (nextchar);
691
	  optind++;
692
	  optopt = 0;
693
	  return '?';
694
	}
695

  
696
      if (pfound != NULL)
697
	{
698
	  option_index = indfound;
699
	  optind++;
700
	  if (*nameend)
701
	    {
702
	      /* Don't test has_arg with >, because some C compilers don't
703
		 allow it to be used on enums.  */
704
	      if (pfound->has_arg)
705
		optarg = nameend + 1;
706
	      else
707
		{
708
		  if (print_errors)
709
		    {
710
		      if (argv[optind - 1][1] == '-')
711
			/* --option */
712
			fprintf (stderr,
713
				 _("%s: option `--%s' doesn't allow an argument\n"),
714
				 argv[0], pfound->name);
715
		      else
716
			/* +option or -option */
717
			fprintf (stderr,
718
				 _("%s: option `%c%s' doesn't allow an argument\n"),
719
				 argv[0], argv[optind - 1][0], pfound->name);
720
		    }
721

  
722
		  nextchar += strlen (nextchar);
723

  
724
		  optopt = pfound->val;
725
		  return '?';
726
		}
727
	    }
728
	  else if (pfound->has_arg == 1)
729
	    {
730
	      if (optind < argc)
731
		optarg = argv[optind++];
732
	      else
733
		{
734
		  if (print_errors)
735
		    fprintf (stderr,
736
			   _("%s: option `%s' requires an argument\n"),
737
			   argv[0], argv[optind - 1]);
738
		  nextchar += strlen (nextchar);
739
		  optopt = pfound->val;
740
		  return optstring[0] == ':' ? ':' : '?';
741
		}
742
	    }
743
	  nextchar += strlen (nextchar);
744
	  if (longind != NULL)
745
	    *longind = option_index;
746
	  if (pfound->flag)
747
	    {
748
	      *(pfound->flag) = pfound->val;
749
	      return 0;
750
	    }
751
	  return pfound->val;
752
	}
753

  
754
      /* Can't find it as a long option.  If this is not getopt_long_only,
755
	 or the option starts with '--' or is not a valid short
756
	 option, then it's an error.
757
	 Otherwise interpret it as a short option.  */
758
      if (!long_only || argv[optind][1] == '-'
759
	  || my_index (optstring, *nextchar) == NULL)
760
	{
761
	  if (print_errors)
762
	    {
763
	      if (argv[optind][1] == '-')
764
		/* --option */
765
		fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
766
			 argv[0], nextchar);
767
	      else
768
		/* +option or -option */
769
		fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
770
			 argv[0], argv[optind][0], nextchar);
771
	    }
772
	  nextchar = (char *) "";
773
	  optind++;
774
	  optopt = 0;
775
	  return '?';
776
	}
777
    }
778

  
779
  /* Look at and handle the next short option-character.  */
780

  
781
  {
782
    char c = *nextchar++;
783
    char *temp = my_index (optstring, c);
784

  
785
    /* Increment `optind' when we start to process its last character.  */
786
    if (*nextchar == '\0')
787
      ++optind;
788

  
789
    if (temp == NULL || c == ':')
790
      {
791
	if (print_errors)
792
	  {
793
	    if (posixly_correct)
794
	      /* 1003.2 specifies the format of this message.  */
795
	      fprintf (stderr, _("%s: illegal option -- %c\n"),
796
		       argv[0], c);
797
	    else
798
	      fprintf (stderr, _("%s: invalid option -- %c\n"),
799
		       argv[0], c);
800
	  }
801
	optopt = c;
802
	return '?';
803
      }
804
    /* Convenience. Treat POSIX -W foo same as long option --foo */
805
    if (temp[0] == 'W' && temp[1] == ';')
806
      {
807
	char *nameend;
808
	const struct option *p;
809
	const struct option *pfound = NULL;
810
	int exact = 0;
811
	int ambig = 0;
812
	int indfound = 0;
813
	int option_index;
814

  
815
	/* This is an option that requires an argument.  */
816
	if (*nextchar != '\0')
817
	  {
818
	    optarg = nextchar;
819
	    /* If we end this ARGV-element by taking the rest as an arg,
820
	       we must advance to the next element now.  */
821
	    optind++;
822
	  }
823
	else if (optind == argc)
824
	  {
825
	    if (print_errors)
826
	      {
827
		/* 1003.2 specifies the format of this message.  */
828
		fprintf (stderr, _("%s: option requires an argument -- %c\n"),
829
			 argv[0], c);
830
	      }
831
	    optopt = c;
832
	    if (optstring[0] == ':')
833
	      c = ':';
834
	    else
835
	      c = '?';
836
	    return c;
837
	  }
838
	else
839
	  /* We already incremented `optind' once;
840
	     increment it again when taking next ARGV-elt as argument.  */
841
	  optarg = argv[optind++];
842

  
843
	/* optarg is now the argument, see if it's in the
844
	   table of longopts.  */
845

  
846
	for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
847
	  /* Do nothing.  */ ;
848

  
849
	/* Test all long options for either exact match
850
	   or abbreviated matches.  */
851
	for (p = longopts, option_index = 0; p->name; p++, option_index++)
852
	  if (!strncmp (p->name, nextchar, nameend - nextchar))
853
	    {
854
	      if ((unsigned int) (nameend - nextchar) == strlen (p->name))
855
		{
856
		  /* Exact match found.  */
857
		  pfound = p;
858
		  indfound = option_index;
859
		  exact = 1;
860
		  break;
861
		}
862
	      else if (pfound == NULL)
863
		{
864
		  /* First nonexact match found.  */
865
		  pfound = p;
866
		  indfound = option_index;
867
		}
868
	      else
869
		/* Second or later nonexact match found.  */
870
		ambig = 1;
871
	    }
872
	if (ambig && !exact)
873
	  {
874
	    if (print_errors)
875
	      fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
876
		       argv[0], argv[optind]);
877
	    nextchar += strlen (nextchar);
878
	    optind++;
879
	    return '?';
880
	  }
881
	if (pfound != NULL)
882
	  {
883
	    option_index = indfound;
884
	    if (*nameend)
885
	      {
886
		/* Don't test has_arg with >, because some C compilers don't
887
		   allow it to be used on enums.  */
888
		if (pfound->has_arg)
889
		  optarg = nameend + 1;
890
		else
891
		  {
892
		    if (print_errors)
893
		      fprintf (stderr, _("%s: option `-W %s' doesn't allow an argument\n"),
894
			       argv[0], pfound->name);
895

  
896
		    nextchar += strlen (nextchar);
897
		    return '?';
898
		  }
899
	      }
900
	    else if (pfound->has_arg == 1)
901
	      {
902
		if (optind < argc)
903
		  optarg = argv[optind++];
904
		else
905
		  {
906
		    if (print_errors)
907
		      fprintf (stderr,
908
			       _("%s: option `%s' requires an argument\n"),
909
			       argv[0], argv[optind - 1]);
910
		    nextchar += strlen (nextchar);
911
		    return optstring[0] == ':' ? ':' : '?';
912
		  }
913
	      }
914
	    nextchar += strlen (nextchar);
915
	    if (longind != NULL)
916
	      *longind = option_index;
917
	    if (pfound->flag)
918
	      {
919
		*(pfound->flag) = pfound->val;
920
		return 0;
921
	      }
922
	    return pfound->val;
923
	  }
924
	  nextchar = NULL;
925
	  return 'W';	/* Let the application handle it.   */
926
      }
927
    if (temp[1] == ':')
928
      {
929
	if (temp[2] == ':')
930
	  {
931
	    /* This is an option that accepts an argument optionally.  */
932
	    if (*nextchar != '\0')
933
	      {
934
		optarg = nextchar;
935
		optind++;
936
	      }
937
	    else
938
	      optarg = NULL;
939
	    nextchar = NULL;
940
	  }
941
	else
942
	  {
943
	    /* This is an option that requires an argument.  */
944
	    if (*nextchar != '\0')
945
	      {
946
		optarg = nextchar;
947
		/* If we end this ARGV-element by taking the rest as an arg,
948
		   we must advance to the next element now.  */
949
		optind++;
950
	      }
951
	    else if (optind == argc)
952
	      {
953
		if (print_errors)
954
		  {
955
		    /* 1003.2 specifies the format of this message.  */
956
		    fprintf (stderr,
957
			     _("%s: option requires an argument -- %c\n"),
958
			     argv[0], c);
959
		  }
960
		optopt = c;
961
		if (optstring[0] == ':')
962
		  c = ':';
963
		else
964
		  c = '?';
965
	      }
966
	    else
967
	      /* We already incremented `optind' once;
968
		 increment it again when taking next ARGV-elt as argument.  */
969
	      optarg = argv[optind++];
970
	    nextchar = NULL;
971
	  }
972
      }
973
    return c;
974
  }
975
}
976

  
977
int
978
getopt (argc, argv, optstring)
979
     int argc;
980
     char *const *argv;
981
     const char *optstring;
982
{
983
  return _getopt_internal (argc, argv, optstring,
984
			   (const struct option *) 0,
985
			   (int *) 0,
986
			   0);
987
}
988

  
989
#endif	/* Not ELIDE_CODE.  */
990

991
#ifdef TEST
992

  
993
/* Compile with -DTEST to make an executable for use in testing
994
   the above definition of `getopt'.  */
995

  
996
int
997
main (argc, argv)
998
     int argc;
999
     char **argv;
1000
{
1001
  int c;
1002
  int digit_optind = 0;
1003

  
1004
  while (1)
1005
    {
1006
      int this_option_optind = optind ? optind : 1;
1007

  
1008
      c = getopt (argc, argv, "abc:d:0123456789");
1009
      if (c == -1)
1010
	break;
1011

  
1012
      switch (c)
1013
	{
1014
	case '0':
1015
	case '1':
1016
	case '2':
1017
	case '3':
1018
	case '4':
1019
	case '5':
1020
	case '6':
1021
	case '7':
1022
	case '8':
1023
	case '9':
1024
	  if (digit_optind != 0 && digit_optind != this_option_optind)
1025
	    printf ("digits occur in two different argv-elements.\n");
1026
	  digit_optind = this_option_optind;
1027
	  printf ("option %c\n", c);
1028
	  break;
1029

  
1030
	case 'a':
1031
	  printf ("option a\n");
1032
	  break;
1033

  
1034
	case 'b':
1035
	  printf ("option b\n");
1036
	  break;
1037

  
1038
	case 'c':
1039
	  printf ("option c with value `%s'\n", optarg);
1040
	  break;
1041

  
1042
	case '?':
1043
	  break;
1044

  
1045
	default:
1046
	  printf ("?? getopt returned character code 0%o ??\n", c);
1047
	}
1048
    }
1049

  
1050
  if (optind < argc)
1051
    {
1052
      printf ("non-option ARGV-elements: ");
1053
      while (optind < argc)
1054
	printf ("%s ", argv[optind++]);
1055
      printf ("\n");
1056
    }
1057

  
1058
  exit (0);
1059
}
1060

  
1061
#endif /* TEST */
tags/v2_0_0_Build_2020/libraries/libjni-potrace/src/main/native/jpotrace/trace.h
1
/* Copyright (C) 2001-2007 Peter Selinger.
2
   This file is part of Potrace. It is free software and it is covered
3
   by the GNU General Public License. See the file COPYING for details. */
4

  
5
/* $Id: trace.h 147 2007-04-09 00:44:09Z selinger $ */
6

  
7
#ifndef TRACE_H
8
#define TRACE_H
9

  
10
#include "potracelib.h"
11
#include "progress.h"
12

  
13
int process_path(path_t *plist, const potrace_param_t *param, progress_t *progress);
14

  
15
#endif /* TRACE_H */
tags/v2_0_0_Build_2020/libraries/libjni-potrace/src/main/native/jpotrace/backend_xfig.c
1
/* Copyright (C) 2001-2007 Peter Selinger.
2
   This file is part of Potrace. It is free software and it is covered
3
   by the GNU General Public License. See the file COPYING for details. */
4

  
5
/* $Id: backend_xfig.c 147 2007-04-09 00:44:09Z selinger $ */
6

  
7
/* The xfig backend of Potrace. */
8

  
9
#include <stdio.h>
10
#include <stdarg.h>
11
#include <string.h>
12
#include <math.h>
13

  
14
#include "main.h"
15
#include "backend_xfig.h"
16
#include "potracelib.h"
17
#include "lists.h"
18
#include "auxiliary.h"
19

  
20
#ifdef HAVE_CONFIG_H
21
#include "config.h"
22
#endif
23

  
24
#ifndef M_PI
25
#define M_PI 3.14159265358979323846
26
#endif
27

  
28
struct pageformat_s {
29
  char *name;
30
  int w, h;
31
};
32
typedef struct pageformat_s pageformat_t;
33

  
34
/* page formats known by xfig, and their dimensions in postscript points */
35
static pageformat_t pageformat[] = {
36
  { "A9",        105,  149 },
37
  { "A8",        149,  211 },
38
  { "A7",        211,  298 },
39
  { "A6",        298,  421 },
40
  { "A5",        421,  595 },
41
  { "A4",        595,  842 },
42
  { "A3",        842, 1191 },
43
  { "A2",       1191, 1685 },
44
  { "A1",       1685, 2383 },
45
  { "A0",       2383, 3370 },
46

  
47
  { "B10",        91,  129 },
48
  { "B9",        129,  182 },
49
  { "B8",        182,  258 },
50
  { "B7",        258,  365 },
51
  { "B6",        365,  516 },
52
  { "B5",        516,  730 },
53
  { "B4",        730, 1032 },
54
  { "B3",       1032, 1460 },
55
  { "B2",       1460, 2064 },
56
  { "B1",       2064, 2920 },
57
  { "B0",       2920, 4127 },
58

  
59
  { "Letter",    612,  792 },
60
  { "Legal",     612, 1008 },
61
  { "Tabloid",   792, 1224 },
62
  { "A",         612,  792 },
63
  { "B",         792, 1224 },
64
  { "C",        1224, 1584 },
65
  { "D",        1584, 2448 },
66
  { "E",        2448, 3168 },
67

  
68
  { NULL, 0, 0 },
69
};
70

  
71
/* ---------------------------------------------------------------------- */
72
/* path-drawing auxiliary functions */
73

  
74
/* structure to hold an affine coordinate transformation */
75
struct trans_s {
76
  double ox, oy;             /* origin */
77
  double dxx, dxy, dyx, dyy; /* transformation matrix */
78
};
79
typedef struct trans_s trans_t;
80

  
81
static inline dpoint_t trans(dpoint_t p, trans_t t) {
82
  dpoint_t res;
83

  
84
  res.x = t.ox + p.x * t.dxx + p.y * t.dyx;
85
  res.y = t.oy + p.x * t.dxy + p.y * t.dyy;
86
  return res;
87
}
88

  
89
/* coordinate quantization */
90
static inline point_t unit(dpoint_t p) {
91
  point_t q;
92

  
93
  q.x = (long)(floor(p.x+.5));
94
  q.y = (long)(floor(p.y+.5));
95
  return q;
96
}
97

  
98
static void xfig_point(FILE *fout, dpoint_t p, trans_t t) {
99
  point_t q;
100

  
101
  q = unit(trans(p, t));
102

  
103
  fprintf(fout, "%ld %ld\n", q.x, q.y);
104
}
105

  
106
/* ---------------------------------------------------------------------- */
107
/* functions for converting a path to a xfig */
108

  
109
/* calculate number of xfig control points in this path */
110
static int npoints(potrace_curve_t *curve, int m) {
111
  int i;
112
  int n=0;
113

  
114
  for (i=0; i<m; i++) {
115
    switch (curve->tag[i]) {
116
    case POTRACE_CORNER:
117
      n += 1;
118
      break;
119
    case POTRACE_CURVETO:
120
      n += 2;
121
      break;
122
    }
123
  }
124
  return n;
125
}
126

  
127
/* do one path. First should be 1 on the very first path, else 0. */
128
static int xfig_path(FILE *fout, potrace_curve_t *curve, trans_t t, int sign) {
129
  int i;
130
  dpoint_t *c;
131
  int m = curve->n;
132

  
133
  fprintf(fout, "3 1 0 0 0 %d 50 0 20 0.000 0 0 0 %d\n", sign=='+' ? 32 : 33, npoints(curve, m));
134

  
135
  for (i=0; i<m; i++) {
136
    c = curve->c[i];
137
    switch (curve->tag[i]) {
138
    case POTRACE_CORNER:
139
      xfig_point(fout, c[1], t);
140
      break;
141
    case POTRACE_CURVETO:
142
      xfig_point(fout, c[0], t);
143
      xfig_point(fout, c[1], t);
144
      break;
145
    }
146
  }
147
  for (i=0; i<m; i++) {
148
    switch (curve->tag[i]) {
149
    case POTRACE_CORNER:
150
      fprintf(fout, "0\n");
151
      break;
152
    case POTRACE_CURVETO:
153
      fprintf(fout, "1 1\n");
154
      break;
155
    }
156
  }
157
  return 0;
158
}
159

  
160
/* ---------------------------------------------------------------------- */
161
/* Backend. */
162

  
163
/* public interface for XFIG */
164
int page_xfig(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) {
165
  potrace_path_t *p;
166
  trans_t t;
167
  double si, co;
168
  double origx = imginfo->trans.orig[0] + imginfo->lmar;
169
  double origy = - imginfo->trans.orig[1] - imginfo->bmar + info.paperheight;
170
  double scalex = imginfo->width / imginfo->pixwidth;
171
  double scaley = imginfo->height / imginfo->pixheight;
172
  char *formatname;
173
  int best, penalty;
174
  pageformat_t *f;
175
  int i;
176
  int x0, y0, x1, y1;  /* in xfig's coordinates */
177
  
178
  si = sin(info.angle/180*M_PI);
179
  co = cos(info.angle/180*M_PI);
180
  
181
  t.ox = 1200/72.0 * origx;
182
  t.oy = 1200/72.0 * origy;
183
  t.dxx = 1200/72.0 * scalex * co;
184
  t.dxy = 1200/72.0 * scalex * -si;
185
  t.dyx = 1200/72.0 * scaley * -si;
186
  t.dyy = 1200/72.0 * scaley * -co;
187

  
188
  x0 = (int)(1200/72.0 * (origx - imginfo->trans.orig[0]));
189
  y0 = (int)(1200/72.0 * (origy + imginfo->trans.orig[1]));
190
  x1 = x0 + (int)(1200/72.0 * imginfo->trans.bb[0]);
191
  y1 = y0 - (int)(1200/72.0 * imginfo->trans.bb[1]);
192

  
193
  best = -1;
194
  formatname = "Letter";
195

  
196
  /* find closest page format */
197
  for (i=0; pageformat[i].name; i++) {
198
    f = &pageformat[i];
199
    if (f->w >= info.paperwidth-1 && f->h >= info.paperheight-1) {
200
      penalty = f->w + f->h;
201
      if (best == -1 || penalty < best) {
202
	best = penalty;
203
	formatname = f->name;
204
      }
205
    }
206
  }
207

  
208
  /* header */
209
  fprintf(fout, "#FIG 3.2\n");
210
  fprintf(fout, "#created by \"POTRACE\" \"VERSION\", written by Peter Selinger 2001-2007\n");
211
  fprintf(fout, "Portrait\n");
212
  fprintf(fout, "Center\n");
213
  fprintf(fout, "Inches\n");
214
  fprintf(fout, "%s\n", formatname);
215
  fprintf(fout, "100.0\n");
216
  fprintf(fout, "Single\n");
217
  fprintf(fout, "-2\n");
218
  fprintf(fout, "1200 2\n");  /* 1200 pixels per inch */
219
  fprintf(fout, "0 32 #%06x\n", info.color);
220
  fprintf(fout, "0 33 #%06x\n", info.fillcolor);
221
  fprintf(fout, "6 %d %d %d %d\n", x0-75, y1-35, x1+75, y0+35); /* bounding box */
222

  
223
  /* write paths. Note: can never use "opticurve" with this backend -
224
     it just does not approximate Bezier curves closely enough.  */
225
  list_forall (p, plist) {
226
    xfig_path(fout, &p->curve, t, p->sign);
227
  }
228

  
229
  fprintf(fout, "-6\n"); /* end bounding box */
230

  
231
  fflush(fout);
232

  
233
  return 0;
234
}
tags/v2_0_0_Build_2020/libraries/libjni-potrace/src/main/native/jpotrace/greymap.c
1
/* Copyright (C) 2001-2007 Peter Selinger.
2
   This file is part of Potrace. It is free software and it is covered
3
   by the GNU General Public License. See the file COPYING for details. */
4

  
5
/* $Id: greymap.c 147 2007-04-09 00:44:09Z selinger $ */
6

  
7
/* Routines for manipulating greymaps, including reading pgm files. We
8
   only deal with greymaps of depth 8 bits. */
9

  
10
#include <stdlib.h>
11
#include <errno.h>
12
#include <string.h>
13
#include <math.h>
14

  
15
#include "greymap.h"
16

  
17
#define INTBITS (8*sizeof(int))
18

  
19
#define mod(a,n) ((a)>=(n) ? (a)%(n) : (a)>=0 ? (a) : (n)-1-(-1-(a))%(n))
20

  
21
static int gm_readbody_pnm(FILE *f, greymap_t **gmp, int magic);
22
static int gm_readbody_bmp(FILE *f, greymap_t **gmp);
23

  
24
/* ---------------------------------------------------------------------- */
25
/* basic greymap routines */
26

  
27
/* return new un-initialized greymap. NULL with errno on error */
28

  
29
greymap_t *gm_new(int w, int h) {
30
  greymap_t *gm;
31
  int errno_save;
32

  
33
  gm = (greymap_t *) malloc(sizeof(greymap_t));
34
  if (!gm) {
35
    return NULL;
36
  }
37
  gm->w = w;
38
  gm->h = h;
39
  gm->map = (signed short int *) malloc(w*h*sizeof(signed short int));
40
  if (!gm->map) {
41
    errno_save = errno;
42
    free(gm);
43
    errno = errno_save;
44
    return NULL;
45
  }
46
  return gm;
47
}
48

  
49
/* free the given greymap */
50
void gm_free(greymap_t *gm) {
51
  if (gm) {
52
    free(gm->map);
53
  }
54
  free(gm);
55
}
56

  
57
/* duplicate the given greymap. Return NULL on error with errno set. */
58
greymap_t *gm_dup(greymap_t *gm) {
59
  greymap_t *gm1 = gm_new(gm->w, gm->h);
60
  if (!gm1) {
61
    return NULL;
62
  }
63
  memcpy(gm1->map, gm->map, gm->w*gm->h*2);
64
  return gm1;
65
}
66

  
67
/* clear the given greymap to color b. */
68
void gm_clear(greymap_t *gm, int b) {
69
  int i;
70

  
71
  if (b==0) {
72
    memset(gm->map, 0, gm->w*gm->h*2);
73
  } else {
74
    for (i=0; i<gm->w*gm->h; i++) {
75
      gm->map[i] = b;
76
    }
77
  }    
78
}
79

  
80
/* ---------------------------------------------------------------------- */
81
/* routines for reading pnm streams */
82

  
83
/* read next character after whitespace and comments. Return EOF on
84
   end of file or error. */
85
static int fgetc_ws(FILE *f) {
86
  int c;
87

  
88
  while (1) {
89
    c = fgetc(f);
90
    if (c=='#') {
91
      while (1) {
92
	c = fgetc(f);
93
	if (c=='\n' || c==EOF) {
94
	  break;
95
	}
96
      }
97
    }
98
    /* space, tab, line feed, carriage return, form-feed */
99
    if (c!=' ' && c!='\t' && c!='\r' && c!='\n' && c!=12) {
100
      return c;
101
    }
102
  }
103
}
104

  
105
/* skip whitespace and comments, then read a non-negative decimal
106
   number from a stream. Return -1 on EOF. Tolerate other errors (skip
107
   bad characters). Do not the read any characters following the
108
   number (put next character back into the stream) */
109

  
110
static int readnum(FILE *f) {
111
  int c;
112
  int acc;
113

  
114
  /* skip whitespace and comments */
115
  while (1) {
116
    c = fgetc_ws(f);
117
    if (c==EOF) {
118
      return -1;
119
    }
120
    if (c>='0' && c<='9') {
121
      break;
122
    }
123
  }
124

  
125
  /* first digit is already in c */
126
  acc = c-'0';
127
  while (1) {
128
    c = fgetc(f);
129
    if (c==EOF) {
130
      break;
131
    }
132
    if (c<'0' || c>'9') {
133
      ungetc(c, f);
134
      break;
135
    }
136
    acc *= 10;
137
    acc += c-'0';
138
  }
139
  return acc;
140
}
141

  
142
/* similar to readnum, but read only a single 0 or 1, and do not read
143
   any characters after it. */
144

  
145
static int readbit(FILE *f) {
146
  int c;
147

  
148
  /* skip whitespace and comments */
149
  while (1) {
150
    c = fgetc_ws(f);
151
    if (c==EOF) {
152
      return -1;
153
    }
154
    if (c>='0' && c<='1') {
155
      break;
156
    }
157
  }
158

  
159
  return c-'0';
160
}
161

  
162
/* ---------------------------------------------------------------------- */
163

  
164
/* read a PNM stream: P1-P6 format (see pnm(5)), or a BMP stream, and
165
   convert the output to a greymap. Return greymap in *gmp. Return 0
166
   on success, -1 on error with errno set, -2 on bad file format (with
167
   error message in gm_read_error), and 1 on premature end of file, -3
168
   on empty file (including files with only whitespace and comments),
169
   -4 if wrong magic number. If the return value is >=0, *gmp is
170
   valid. */
171

  
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff