root/tags/5.4.pre05/wxis_src/arglist.c

Revision 1, 5.1 kB (checked in by heitor.barbieri, 4 years ago)

Criação do svn para Cisis.

Line 
1/* --------------------------------------------------------------- ARGLIST.C */
2
3/* /////////////////////////////////////////////////////////////////////////
4
5   [ Version 1.0 ]
6   16.Oct.1998 - Argument list.
7
8   ///////////////////////////////////////////////////////////////////////// */
9
10/* ---------------------------------------------------------- C HEADER FILES */
11#include <stdlib.h>
12#include <string.h>
13#include <ctype.h>
14/* ------------------------------------------------------------ HEADER FILES */
15/* include "cisis.h" */
16#include "easyfc.h"
17#include "arglist.h"
18
19/* ================================================================ arg_load */
20void arg_load(STRUCT_ARGUMENT *item,    /* argument list item */
21                                  char *id,                                             /* argument identification */
22                                  ARG_TYPE id_type)                     /* argument type */
23{
24/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
25        1. Reset argument parameter
26        2. Set argument parameter values
27
28   1.0 - 30.Oct.1998
29>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */
30
31        /* 1 */
32   memset(item,0x00,sizeof(STRUCT_ARGUMENT));
33
34        /* 2 */
35   item->id = id;
36   item->id_size = (int)strlen(id);
37   item->id_type = id_type;
38} /* arg_load */
39/* =============================================================== arg_lines */
40int arg_lines(char *argv[],     /* argment vector */
41                                  int arg_from, /* first argument vector index */
42              int arg_max,              /* argument vector index limit */
43                                  char *buff)           /* buffer to be splited */
44{
45/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
46        1. Avoid empty buffer
47   2. Loop for all lines
48   3. Find line end, replace line end with end of string character
49   4. Check limit of arguments, if reached return -1
50   5. Set line argument begin
51   6. Return next index argument available
52
53   1.0 - 16.Oct.1998
54>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */
55        int argi; /* argument count */
56        char *p;         /* auxiliary buffer pointer */
57
58   /* 1 */
59        if (!buff) return arg_from;
60        if (!*buff) return arg_from;
61
62   /* 2 */
63   for (p = argv[arg_from] = buff,argi = arg_from/*+1*/; *p; )
64   {
65                /* 3 */
66        if (*p != '\n' && *p != '\r')
67      {
68        p++;
69        continue;
70      }
71
72                do
73      {
74        *p++ = '\0';
75      }
76      while (*p == '\n' || *p == '\r');
77
78                /* 4 */
79                if (argi >= arg_max) return -1;
80
81                /* 5 */
82      if (*p)
83      {
84        argv[++argi] = p;
85      }
86
87   } /* for */
88
89        /* 6 */
90        return ++argi;
91} /* arg_lines */
92/* ================================================================== arg_in */
93int arg_in(char *argv[],        /* argment vector */
94                          int arg_from,      /* first argument vector index */
95           int arg_max,       /* argument vector index limit */
96           char *filename)              /* in file name */
97{
98/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
99        1. Get file content, on error return negative EFC_FILE_ERROR_LIST
100   2. Split lines trought out the argment vector, on error return -5
101
102   1.0 - 16.Oct.1998
103>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */
104        char *buff;             /* buffer with file contents */
105   long qttbytes;       /* file size, in bytes */
106
107        /* 1 */
108        buff = efc_filecontent(filename,&qttbytes);
109   if (qttbytes < 0L) return (int)qttbytes;
110
111        /* 2 */
112        arg_from = arg_lines(argv,arg_from,arg_max,buff);
113        return arg_from > 0 ? arg_from : -ARG_ERROR_MAX;
114} /* arg_in */
115/* ================================================================ arg_read */
116void arg_read(STRUCT_ARGUMENT argl[],   /* available argument list */
117                                  int argl_max,                         /* quantity of available arguments */
118                                  char *argv[],                         /* arrray of arguments */
119                                  int arg_from,                         /* first argument */
120                                  int arg_max)                          /* quantity of arguments */
121{
122/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
123        1. Loop for all arguments received
124   2. Scan the list of valid arguments
125   3. Check argument identifier
126   4. BOOLEAN argument, presence means TRUE
127   5. NUMBER/TEXT argument requires the equal signal
128
129   1.0 - 16.Oct.1998
130>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */
131   int argi;    /* arguments loop index */
132   int argli;   /* arguments list loop index */
133   char *argp;  /* auxiliary argument pointer */
134
135        /* 1 */
136   for (argi = arg_from; argi < arg_max; argi++) {
137
138                argp = argv[argi];
139      if (!argp) continue;
140
141                /* 2 */
142      for (argli = 0; argli < argl_max; argli++) {
143
144                        /* 3 */
145        if (strncmp(argp,argl[argli].id,argl[argli].id_size) != 0) continue;
146
147         switch (argl[argli].id_type) {
148
149                        /* 4 */
150         case ARG_TYPE_BOOLEAN :
151            if (*(argp+argl[argli].id_size) == '\0') {
152                argl[argli].num = (long)TRUE;
153                                        argl[argli].text = argv[argi];
154                                        argl[argli].status = 1;
155            }
156                break;
157
158                        /* 5 */
159         case ARG_TYPE_NUMBER :
160         case ARG_TYPE_TEXT :
161            if (*(argp+argl[argli].id_size) == '=') {
162                argl[argli].num = atol(argp+argl[argli].id_size+1);
163                                        argl[argli].text = argp+argl[argli].id_size+1;
164                                        argl[argli].status = 1;
165            }
166                break;
167
168         } /* switch */
169
170      } /* for */
171
172   } /* for */
173} /* arg_read */
Note: See TracBrowser for help on using the browser.