Skip to content

Commit

Permalink
Implemented a getPackageFileNames, which finds packages located in OP…
Browse files Browse the repository at this point in the history
…ENMODELICALIBRARY path.

Fixed a bug with pow(INTEGER,NEGATIVE_INTEGER), this is now not converted back to an Integer, kept as real instead.

git-svn-id: https://openmodelica.org/svn/OpenModelica/branches/MathCoreOSMC@3907 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Björn Zachrisson committed Feb 20, 2009
1 parent b53e94f commit 053de6c
Show file tree
Hide file tree
Showing 5 changed files with 162 additions and 9 deletions.
2 changes: 1 addition & 1 deletion Compiler/ClassLoader.mo
Expand Up @@ -109,7 +109,7 @@ algorithm
0 := System.regularFileExists(filename);
end existRegularFile;

protected function existDirectoryFile
public function existDirectoryFile
"function: existDirectoryFile
Checks if a directory exist"
input String filename;
Expand Down
8 changes: 4 additions & 4 deletions Compiler/Mod.mo
Expand Up @@ -1541,13 +1541,13 @@ public function modEquation "function: modEquation
"
input Types.Mod inMod;
output Option<Types.EqMod> outTypesEqModOption;
algorithm
algorithm
outTypesEqModOption:=
matchcontinue (inMod)
local Option<Types.EqMod> e;
case Types.NOMOD() then NONE;
case Types.REDECL(finalPrefix = _) then NONE;
case Types.MOD(eqModOption = e) then e;
case Types.NOMOD() then NONE;
case Types.REDECL(finalPrefix = _) then NONE;
case Types.MOD(eqModOption = e) then e;
end matchcontinue;
end modEquation;

Expand Down
8 changes: 8 additions & 0 deletions Compiler/System.mo
Expand Up @@ -388,6 +388,14 @@ public function regularFileExists
external "C" ;
end regularFileExists;

public function getPackageFileNames
input String inString1;
input String inString2;
output String outString;

external "C" ;
end getPackageFileNames;

public function directoryExists
input String inString;
output Integer outInteger;
Expand Down
9 changes: 9 additions & 0 deletions Compiler/Values.mo
Expand Up @@ -357,6 +357,14 @@ algorithm
then
REAL(rv3);
//POW
case (INTEGER(iv1),INTEGER(iv2), POWOP) // this means indirect that we are dealing with decimal numbers (a^(-b)) = 1/a^b
equation
true = (iv2 < 0);
rv1 = intReal(iv1);
rv2 = intReal(iv2);
rv3 = realPow(rv1, rv2);
then
REAL(rv3);
case (INTEGER(iv1),INTEGER(iv2), POWOP)
equation
e = Exp.safeIntOp(iv1,iv2,Exp.POWOP);
Expand All @@ -365,6 +373,7 @@ algorithm
outv;
case (REAL(rv1),INTEGER(iv2), POWOP)
equation
print(" REAL-INTEGER \n");
rv2 = intReal(iv2);
rv3 = realPow(rv1, rv2);
then
Expand Down
144 changes: 140 additions & 4 deletions Compiler/runtime/systemimpl.c
Expand Up @@ -1474,17 +1474,100 @@ RML_BEGIN_LABEL(System__hash)
}
RML_END_LABEL

int fileExistsLocal(char * s){
int ret=-1;
WIN32_FIND_DATA FileData;
HANDLE sh;
sh = FindFirstFile(s, &FileData);
if (sh == INVALID_HANDLE_VALUE) {
ret = -1;
}
else {
if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
ret = -1;
}
else {
ret = 0;
}
FindClose(sh);
}
return ret;
}

RML_BEGIN_LABEL(System__getPackageFileNames)
{
char* dir = RML_STRINGDATA(rmlA0);
char* fileName = RML_STRINGDATA(rmlA1);
char * strSearch = (char*)malloc(sizeof(char*)*(strlen(dir)+strlen(fileName)+10));
char * tmpSearchString = (char*)malloc(sizeof(char*)*MAX_PATH);
int mallocSize = MAX_PATH,current=0;
char * retString = (char*)malloc(mallocSize*sizeof(char*));
int ret_val;
void *res;
WIN32_FIND_DATA FileData;
HANDLE sh;

sprintf(strSearch,"%s\\*\0",dir);
sh = FindFirstFile(strSearch, &FileData);

if (sh == INVALID_HANDLE_VALUE) {
printf(" invalid\n");
}
else {
if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
sprintf(tmpSearchString,"%s\\%s\\%s",dir,FileData.cFileName,fileName);
if(fileExistsLocal(tmpSearchString)==0){
if(strlen(FileData.cFileName)+current>mallocSize){
mallocSize *= 2;
retString = (char *)realloc(retString,mallocSize);
}
if(current==0){
sprintf(retString,"%s",FileData.cFileName);
}
else{
sprintf(retString,",%s",FileData.cFileName);
}
current +=strlen(FileData.cFileName)+1;
}
}
}
while(FindNextFile(sh, &FileData) != 0){
if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
sprintf(tmpSearchString,"%s\\%s\\%s",dir,FileData.cFileName,fileName);
if(fileExistsLocal(tmpSearchString)==0){
if(strlen(FileData.cFileName)+current>mallocSize){
mallocSize *= 2;
retString = (char *)realloc(retString,mallocSize);
}
if(current==0){
sprintf(retString,"%s",FileData.cFileName);
}
else{
sprintf(retString,"%s,%s",retString,FileData.cFileName);
}
current +=strlen(FileData.cFileName)+1;
}
}
}
FindClose(sh);
//printf(" to return: %s\n",retString);
rmlA0 = (void*) mk_scon(retString);
free(strSearch);
free(tmpSearchString);
free(retString);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(System__directoryExists)
{
char* str = RML_STRINGDATA(rmlA0);
int ret_val;
void *res;
WIN32_FIND_DATA FileData;
HANDLE sh;

if (str == NULL)
RML_TAILCALLK(rmlFC);

sh = FindFirstFile(str, &FileData);
if (sh == INVALID_HANDLE_VALUE) {
ret_val = 1;
Expand All @@ -1498,9 +1581,7 @@ RML_BEGIN_LABEL(System__directoryExists)
}
FindClose(sh);
}

rmlA0 = (void*) mk_icon(ret_val);

RML_TAILCALLK(rmlSC);
}
RML_END_LABEL
Expand Down Expand Up @@ -3419,6 +3500,61 @@ RML_BEGIN_LABEL(System__groupDelimiter)
}
RML_END_LABEL

char *path_cat (const char *str1, char *str2,char *fileString) {
size_t str1_len = strlen(str1),str2_len = strlen(str2);
struct stat buf;
char *result;
int ret_val;

result = (char *)malloc(PATH_MAX*sizeof( *result));
if(strcmp(str2,"..") ==0 || strcmp(str2,".")==0){ result[0]= '\0'; return result;}
sprintf(result,"%s%s/%s",str1,str2,fileString);
ret_val = stat(result, &buf);

if (ret_val == 0 && buf.st_mode & S_IFREG) {
return result;
}
result[0]='\0';
return result;
}


RML_BEGIN_LABEL(System__getPackageFileNames)
{
char* dir_path = RML_STRINGDATA(rmlA0);
char* fileName = RML_STRINGDATA(rmlA1);
struct dirent *dp;
int mallocSize = PATH_MAX,current=0;
char * retString = (char*)malloc(mallocSize*sizeof(char*));
// enter existing path to directory below
DIR *dir = opendir(dir_path);
while ((dp=readdir(dir)) != NULL) {
char *tmp;
tmp = path_cat(dir_path, dp->d_name, fileName);
if(strlen(tmp)>0){
if(strlen(dp->d_name)+current>mallocSize){
mallocSize *= 2;
retString = (char *)realloc(retString,mallocSize);
}
if(current==0){
sprintf(retString,"%s",dp->d_name);
}
else{
sprintf(retString,"%s,%s",retString,dp->d_name);
}
current +=strlen(dp->d_name)+1;
}
free(tmp);
tmp=NULL;
}
closedir(dir);
//printf(" res string linux: %s\n" , retString);
rmlA0 = (void*) mk_scon(retString);
free(retString);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(System__directoryExists)
{
char* str = RML_STRINGDATA(rmlA0);
Expand Down

0 comments on commit 053de6c

Please sign in to comment.