00001
00002
00003
00004
00005
00006
00007 #include <string.h>
00008 #include <alloca.h>
00009 #include <stdlib.h>
00010
00011 #include "pathf90_libU_intrin.h"
00012 #include "externals.h"
00013
00014 #define C_IFY(name, name_len, notrim) \
00015 c_ify(alloca((name_len) + 1), (name), (name_len), (notrim))
00016 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
00017 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 static char *
00028 c_ify(char *temp, char *value, int value_len, int notrim) {
00029 int i = value_len;
00030 if (!notrim) {
00031 for (i = value_len; i > 0 && ' ' == value[i - 1]; i -= 1)
00032 ;
00033 }
00034 i ? memcpy(temp, value, i) : 0;
00035 temp[i] = '\0';
00036 return temp;
00037 }
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 static char *
00048 f_ify(char *dest, int dest_len, char *src, int src_len) {
00049 int copy_len = MIN(src_len, dest_len);
00050 memcpy(dest, src, copy_len);
00051 int pad_len = MAX(0, dest_len - copy_len);
00052 if (pad_len) {
00053 memset(dest + copy_len, ' ', pad_len);
00054 }
00055 return dest;
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 static void
00068 helper(int error, char *dest, char *src, pathf90_i4 *length, pathf90_i4 *status,
00069 int dest_len) {
00070 if (error) {
00071 dest ? memset(dest, ' ', dest_len) : 0;
00072 length ? (*length = 0) : 0;
00073 status ? (*status = 1) : 0;
00074 return;
00075 }
00076 int src_len = strlen(src);
00077 status ? (*status = (-(src_len > dest_len))) : 0;
00078 dest ? f_ify(dest, dest_len, src, src_len) : 0;
00079 length ? (*length = src_len) : 0;
00080 }
00081
00082
00083 pathf90_i4
00084 _Command_argument_count() {
00085 return ARGC - 1;
00086 }
00087
00088
00089 void
00090 _Get_command(char *command, pathf90_i4 *length, pathf90_i4 *status,
00091 pathf90_i4 command_len) {
00092 unsigned c_value_len = 0;
00093 int i;
00094 for (i = 0; i < ARGC; i += 1) {
00095 c_value_len += strlen(ARGV[i]) + (i > 0);
00096 }
00097 status ? (*status = (command ? (-(c_value_len > command_len)): 0)) : 0;
00098 length ? (*length = c_value_len) : 0;
00099 if (command) {
00100 char *tmp = command;
00101 int tmp_len = command_len;
00102 int i;
00103 for (i = 0; i < ARGC; i += 1) {
00104 int src_len = strlen(ARGV[i]);
00105 int copy_len = MIN(src_len, tmp_len);
00106 if (i > 0) {
00107 *tmp++ = ' ';
00108 tmp_len--;
00109 }
00110 memcpy(tmp, ARGV[i], copy_len);
00111 tmp += copy_len;
00112 tmp_len -= copy_len;
00113 if (tmp_len <= 0) {
00114 return;
00115 }
00116 }
00117 tmp_len ? memset(tmp, ' ', tmp_len) : 0;
00118 }
00119 }
00120
00121
00122 void
00123 _Get_command_argument(pathf90_i4 *number, char *value,
00124 pathf90_i4 *length, pathf90_i4 *status, pathf90_i4 value_len) {
00125 char *c_value = ARGV[*number];
00126 helper((*number < 0 || *number >= ARGC), value, c_value, length, status,
00127 value_len);
00128 }
00129
00130
00131 void
00132 _Get_environment_variable(char *name, char *value, pathf90_i4 *length,
00133 pathf90_i4 *status, pathf90_i4 *trim_name, pathf90_i4 name_len,
00134 pathf90_i4 value_len) {
00135 char *c_name = C_IFY(name, name_len, (trim_name && !*trim_name));
00136 char *c_value = getenv(c_name);
00137 helper(!c_value, value, c_value, length, status, value_len);
00138 }
00139
00140 #include "liberrno.h"
00141
00142
00143 pathf90_i4
00144 _Is_iostat_end(pathf90_i4 *iostat) {
00145 return *iostat == FERDPEOF;
00146 }
00147
00148
00149 pathf90_i4
00150 _Is_iostat_eor(pathf90_i4 *iostat) {
00151 return *iostat == FEEORCND;
00152 }
00153