00001
00002
00003
00004 #include <stdio.h>
00005 #include <stdlib.h>
00006 #include <string.h>
00007 #include "pvm3.h"
00008
00009 #include "cser.h"
00010
00011
00012 int _cser_serialize(FILE* file, const char* value, size_t size) {
00013 size_t last, cur;
00014
00015 for (cur = last = 0; cur < size; ++cur) {
00016
00017 if (value[cur] == '\\' || value[cur] == '\n' || value[cur] == '\0') {
00018 if (cur > last)
00019 fprintf(file, "%.*s", cur - last, &value[last]);
00020 fprintf(file, "\\%c", value[cur] == '\n' ? 'n' : value[cur] == '\0' ? '0' : value[cur]);
00021 last = cur + 1;
00022 }
00023 }
00024
00025
00026 if (cur > last)
00027 fprintf(file, "%.*s", cur - last, &value[last]);
00028
00029 return 0;
00030 }
00031
00032
00033 int cser_write_str(FILE* file, const char* name, const char* value) {
00034 fprintf(file, "%s=", name);
00035 if (_cser_serialize(file, value, strlen(value)))
00036 return -1;
00037 fprintf(file, "\n");
00038 return 0;
00039 }
00040
00041
00042 int cser_write_num(FILE* file, const char* name, long num) {
00043 fprintf(file, "%s=%ld\n", name, num);
00044 return 0;
00045 }
00046
00047
00048 int cser_read(FILE* file, char* buffer, size_t blen, char** name, char** str_value, long* num_value) {
00049 size_t bpos = 0, inpos = 0;
00050 char inbuf[512];
00051 char esc = 0;
00052
00053
00054 *name = NULL;
00055 *str_value = NULL;
00056 *num_value = 0;
00057
00058
00059 if (feof(file))
00060 return -1;
00061
00062
00063 while (fgets(inbuf, sizeof(inbuf), file) != NULL) {
00064
00065 for (inpos = 0; inbuf[inpos] != 0 && inbuf[inpos] != '\n'; ++inpos) {
00066
00067 if (bpos < blen - 1) {
00068
00069 if (esc) {
00070
00071 switch(inbuf[inpos]) {
00072 case '\\': buffer[bpos++] = '\\'; break;
00073 case 'n': buffer[bpos++] = '\n'; break;
00074 case '0': buffer[bpos++] = '\0'; break;
00075 default: break;
00076 }
00077 esc = 0;
00078 } else
00079
00080 if (inbuf[inpos] == '\\') {
00081 esc = 1;
00082 } else
00083
00084 {
00085 buffer[bpos++] = inbuf[inpos];
00086 }
00087 }
00088 }
00089
00090
00091 if (inbuf[inpos] == '\n')
00092 break;
00093 }
00094
00095
00096 buffer[bpos] = 0;
00097
00098
00099 *name = buffer;
00100 *str_value = strchr(buffer, '=');
00101
00102
00103 if (*str_value != NULL) {
00104
00105 **str_value = 0;
00106 ++ *str_value;
00107
00108
00109 *num_value = atol(*str_value);
00110 }
00111
00112 return 0;
00113 }
00114
00115 int cser_pkstr(char *str){
00116 int size = strlen(str)+1;
00117
00118 pvm_pkint(&size, 1, 1);
00119 pvm_pkbyte(str, size, 1);
00120
00121 return 0;
00122 }
00123
00124 char *cser_upkstr() {
00125 int size = -1;
00126
00127 pvm_upkint(&size, 1, 1);
00128 char *buf = malloc(sizeof(char)*size);
00129 pvm_upkbyte(buf, size, 1);
00130
00131 return buf;
00132 }
00133
00134
00135
00136 int sendStruct(int tid, int tag, void *dataStruct, packData_t *packer) {
00137 pvm_initsend(PvmDataDefault);
00138 packer(dataStruct);
00139 pvm_send(tid, tag);
00140
00141 return 0;
00142 }
00143
00144 int mcastStruct(int *tids, int tidListSize, int tag, void *dataStruct, packData_t *packer) {
00145 pvm_initsend(PvmDataDefault);
00146 packer(dataStruct);
00147 pvm_mcast(tids, tidListSize, tag);
00148
00149 return 0;
00150 }
00151
00152 void *recvStruct(int tid, int tag, unpackData_t *unpacker){
00153 pvm_recv(tid, tag);
00154
00155 return unpacker();
00156 }
00157