Skip to content

Commit

Permalink
Merge pull request #517 from unidoc-build/prep-rc-v1.35.0
Browse files Browse the repository at this point in the history
  • Loading branch information
gunnsth authored Jul 28, 2024
2 parents 2509d38 + f96ddf9 commit 3e7ab0e
Show file tree
Hide file tree
Showing 70 changed files with 59,574 additions and 57,667 deletions.
9 changes: 5 additions & 4 deletions algo/algo.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
// Use of this source code is governed by the UniDoc End User License Agreement
// terms that can be accessed at https://unidoc.io/eula/

package algo ;import _d "strconv";func RepeatString (s string ,cnt int )string {if cnt <=0{return "";};_ae :=make ([]byte ,len (s )*cnt );_ffb :=[]byte (s );for _gf :=0;_gf < cnt ;_gf ++{copy (_ae [_gf :],_ffb );};return string (_ae );};
package algo ;import _c "strconv";

// NaturalLess compares two strings in a human manner so rId2 sorts less than rId10
func NaturalLess (lhs ,rhs string )bool {_gd ,_ac :=0,0;for _gd < len (lhs )&&_ac < len (rhs ){_f :=lhs [_gd ];_fa :=rhs [_ac ];_e :=_c (_f );_ff :=_c (_fa );switch {case _e &&!_ff :return true ;case !_e &&_ff :return false ;case !_e &&!_ff :if _f !=_fa {return _f < _fa ;
};_gd ++;_ac ++;default:_b :=_gd +1;_bd :=_ac +1;for _b < len (lhs )&&_c (lhs [_b ]){_b ++;};for _bd < len (rhs )&&_c (rhs [_bd ]){_bd ++;};_ca ,_ :=_d .ParseUint (lhs [_gd :_b ],10,64);_bdf ,_ :=_d .ParseUint (rhs [_gd :_bd ],10,64);if _ca !=_bdf {return _ca < _bdf ;
};_gd =_b ;_ac =_bd ;};};return len (lhs )< len (rhs );};func _c (_g byte )bool {return _g >='0'&&_g <='9'};
func NaturalLess (lhs ,rhs string )bool {_d ,_cc :=0,0;for _d < len (lhs )&&_cc < len (rhs ){_a :=lhs [_d ];_ff :=rhs [_cc ];_cg :=_b (_a );_db :=_b (_ff );switch {case _cg &&!_db :return true ;case !_cg &&_db :return false ;case !_cg &&!_db :if _a !=_ff {return _a < _ff ;
};_d ++;_cc ++;default:_fg :=_d +1;_be :=_cc +1;for _fg < len (lhs )&&_b (lhs [_fg ]){_fg ++;};for _be < len (rhs )&&_b (rhs [_be ]){_be ++;};_de ,_ :=_c .ParseUint (lhs [_d :_fg ],10,64);_bec ,_ :=_c .ParseUint (rhs [_d :_be ],10,64);if _de !=_bec {return _de < _bec ;
};_d =_fg ;_cc =_be ;};};return len (lhs )< len (rhs );};func _b (_f byte )bool {return _f >='0'&&_f <='9'};func RepeatString (s string ,cnt int )string {if cnt <=0{return "";};_ag :=make ([]byte ,len (s )*cnt );_fb :=[]byte (s );for _agb :=0;_agb < cnt ;
_agb ++{copy (_ag [_agb :],_fb );};return string (_ag );};
884 changes: 441 additions & 443 deletions chart/chart.go

Large diffs are not rendered by default.

78 changes: 39 additions & 39 deletions color/color.go

Large diffs are not rendered by default.

716 changes: 360 additions & 356 deletions common/axcontrol/axcontrol.go

Large diffs are not rendered by default.

721 changes: 361 additions & 360 deletions common/common.go

Large diffs are not rendered by default.

47 changes: 24 additions & 23 deletions common/license/license.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,39 +11,40 @@

// Package license helps manage commercial licenses and check if they
// are valid for the version of UniOffice used.
package license ;import _g "github.com/unidoc/unioffice/internal/license";

// LicenseKey represents a loaded license key.
type LicenseKey =_g .LicenseKey ;

// MakeUnlicensedKey returns a default key.
func MakeUnlicensedKey ()*LicenseKey {return _g .MakeUnlicensedKey ()};
package license ;import _cf "github.com/unidoc/unioffice/internal/license";const (LicenseTierUnlicensed =_cf .LicenseTierUnlicensed ;LicenseTierCommunity =_cf .LicenseTierCommunity ;LicenseTierIndividual =_cf .LicenseTierIndividual ;LicenseTierBusiness =_cf .LicenseTierBusiness ;
);

// SetLicenseKey sets and validates the license key.
func SetLicenseKey (content string ,customerName string )error {return _g .SetLicenseKey (content ,customerName );};
func SetLicenseKey (content string ,customerName string )error {return _cf .SetLicenseKey (content ,customerName );};

// GetLicenseKey returns the currently loaded license key.
func GetLicenseKey ()*LicenseKey {return _cf .GetLicenseKey ()};

// GetMeteredState checks the currently used metered document usage status,
// documents used and credits available.
func GetMeteredState ()(_g .MeteredStatus ,error ){return _g .GetMeteredState ()};
func GetMeteredState ()(_cf .MeteredStatus ,error ){return _cf .GetMeteredState ()};

// SetMeteredKeyPersistentCache sets the metered License API Key persistent cache.
// Default value `true`, set to `false` will report the usage immediately to license server,
// this can be used when there's no access to persistent data storage.
func SetMeteredKeyPersistentCache (val bool ){_g .SetMeteredKeyPersistentCache (val )};
// SetLegacyLicenseKey installs a legacy license code. License codes issued prior to June 2019.
// Will be removed at some point in a future major version.
func SetLegacyLicenseKey (s string )error {return _cf .SetLegacyLicenseKey (s )};

// LegacyLicenseType is the type of license
type LegacyLicenseType =_g .LegacyLicenseType ;const (LicenseTierUnlicensed =_g .LicenseTierUnlicensed ;LicenseTierCommunity =_g .LicenseTierCommunity ;LicenseTierIndividual =_g .LicenseTierIndividual ;LicenseTierBusiness =_g .LicenseTierBusiness ;);
// MakeUnlicensedKey returns a default key.
func MakeUnlicensedKey ()*LicenseKey {return _cf .MakeUnlicensedKey ()};

// LicenseKey represents a loaded license key.
type LicenseKey =_cf .LicenseKey ;

// SetMeteredKey sets the metered License API key required for SaaS operation.
// Document usage is reported periodically for the product to function correctly.
func SetMeteredKey (apiKey string )error {return _g .SetMeteredKey (apiKey )};
func SetMeteredKey (apiKey string )error {return _cf .SetMeteredKey (apiKey )};

// LegacyLicense holds the old-style unioffice license information.
type LegacyLicense =_g .LegacyLicense ;
// LegacyLicenseType is the type of license
type LegacyLicenseType =_cf .LegacyLicenseType ;

// GetLicenseKey returns the currently loaded license key.
func GetLicenseKey ()*LicenseKey {return _g .GetLicenseKey ()};
// SetMeteredKeyPersistentCache sets the metered License API Key persistent cache.
// Default value `true`, set to `false` will report the usage immediately to license server,
// this can be used when there's no access to persistent data storage.
func SetMeteredKeyPersistentCache (val bool ){_cf .SetMeteredKeyPersistentCache (val )};

// SetLegacyLicenseKey installs a legacy license code. License codes issued prior to June 2019.
// Will be removed at some point in a future major version.
func SetLegacyLicenseKey (s string )error {return _g .SetLegacyLicenseKey (s )};
// LegacyLicense holds the old-style unioffice license information.
type LegacyLicense =_cf .LegacyLicense ;
115 changes: 57 additions & 58 deletions common/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,97 +9,96 @@
// Use of this source code is governed by the UniDoc End User License Agreement
// terms that can be accessed at https://unidoc.io/eula/

package logger ;import (_d "fmt";_c "io";_e "os";_de "path/filepath";_bd "runtime";);
package logger ;import (_b "fmt";_dc "io";_cd "os";_d "path/filepath";_cf "runtime";);

// Info logs info message.
func (_cd ConsoleLogger )Info (format string ,args ...interface{}){if _cd .LogLevel >=LogLevelInfo {_gb :="\u005bI\u004e\u0046\u004f\u005d\u0020";_cd .output (_e .Stdout ,_gb ,format ,args ...);};};func (_af WriterLogger )logToWriter (_afc _c .Writer ,_gf string ,_dea string ,_cbd ...interface{}){_fda (_afc ,_gf ,_dea ,_cbd );
};

// Error logs error message.
func (_g ConsoleLogger )Error (format string ,args ...interface{}){if _g .LogLevel >=LogLevelError {_aa :="\u005b\u0045\u0052\u0052\u004f\u0052\u005d\u0020";_g .output (_e .Stdout ,_aa ,format ,args ...);};};var Log Logger =DummyLogger {};
// NewWriterLogger creates new 'writer' logger.
func NewWriterLogger (logLevel LogLevel ,writer _dc .Writer )*WriterLogger {logger :=WriterLogger {Output :writer ,LogLevel :logLevel };return &logger ;};

// Error does nothing for dummy logger.
func (DummyLogger )Error (format string ,args ...interface{}){};

// IsLogLevel returns true from dummy logger.
func (DummyLogger )IsLogLevel (level LogLevel )bool {return true };
// Debug does nothing for dummy logger.
func (DummyLogger )Debug (format string ,args ...interface{}){};

// Notice does nothing for dummy logger.
func (DummyLogger )Notice (format string ,args ...interface{}){};
// Error logs error message.
func (_af ConsoleLogger )Error (format string ,args ...interface{}){if _af .LogLevel >=LogLevelError {_eb :="\u005b\u0045\u0052\u0052\u004f\u0052\u005d\u0020";_af .output (_cd .Stdout ,_eb ,format ,args ...);};};

// Debug logs debug message.
func (_cdg WriterLogger )Debug (format string ,args ...interface{}){if _cdg .LogLevel >=LogLevelDebug {_fb :="\u005b\u0044\u0045\u0042\u0055\u0047\u005d\u0020";_cdg .logToWriter (_cdg .Output ,_fb ,format ,args ...);};};
// Notice logs notice message.
func (_ed ConsoleLogger )Notice (format string ,args ...interface{}){if _ed .LogLevel >=LogLevelNotice {_bfe :="\u005bN\u004f\u0054\u0049\u0043\u0045\u005d ";_ed .output (_cd .Stdout ,_bfe ,format ,args ...);};};

// Warning logs warning message.
func (_ac ConsoleLogger )Warning (format string ,args ...interface{}){if _ac .LogLevel >=LogLevelWarning {_bdfb :="\u005b\u0057\u0041\u0052\u004e\u0049\u004e\u0047\u005d\u0020";_ac .output (_e .Stdout ,_bdfb ,format ,args ...);};};
// DummyLogger does nothing.
type DummyLogger struct{};

// Logger is the interface used for logging in the unipdf package.
type Logger interface{Error (_bdf string ,_ce ...interface{});Warning (_ed string ,_ec ...interface{});Notice (_a string ,_ecd ...interface{});Info (_bc string ,_bb ...interface{});Debug (_bdc string ,_ag ...interface{});Trace (_f string ,_ff ...interface{});
IsLogLevel (_fe LogLevel )bool ;};
// Info logs info message.
func (_gb ConsoleLogger )Info (format string ,args ...interface{}){if _gb .LogLevel >=LogLevelInfo {_ac :="\u005bI\u004e\u0046\u004f\u005d\u0020";_gb .output (_cd .Stdout ,_ac ,format ,args ...);};};

// Warning does nothing for dummy logger.
func (DummyLogger )Warning (format string ,args ...interface{}){};
func (DummyLogger )Warning (format string ,args ...interface{}){};func (_eag WriterLogger )logToWriter (_fda _dc .Writer ,_edf string ,_ba string ,_ca ...interface{}){_adf (_fda ,_edf ,_ba ,_ca );};const (LogLevelTrace LogLevel =5;LogLevelDebug LogLevel =4;
LogLevelInfo LogLevel =3;LogLevelNotice LogLevel =2;LogLevelWarning LogLevel =1;LogLevelError LogLevel =0;);

// WriterLogger is the logger that writes data to the Output writer
type WriterLogger struct{LogLevel LogLevel ;Output _c .Writer ;};
// Info does nothing for dummy logger.
func (DummyLogger )Info (format string ,args ...interface{}){};

// SetLogger sets 'logger' to be used by the unidoc unipdf library.
func SetLogger (logger Logger ){Log =logger };

// DummyLogger does nothing.
type DummyLogger struct{};

// Trace does nothing for dummy logger.
func (DummyLogger )Trace (format string ,args ...interface{}){};

// Debug does nothing for dummy logger.
func (DummyLogger )Debug (format string ,args ...interface{}){};

// NewConsoleLogger creates new console logger.
func NewConsoleLogger (logLevel LogLevel )*ConsoleLogger {return &ConsoleLogger {LogLevel :logLevel }};

// Debug logs debug message.
func (_db ConsoleLogger )Debug (format string ,args ...interface{}){if _db .LogLevel >=LogLevelDebug {_eb :="\u005b\u0044\u0045\u0042\u0055\u0047\u005d\u0020";_db .output (_e .Stdout ,_eb ,format ,args ...);};};func (_fd ConsoleLogger )output (_cdc _c .Writer ,_cc string ,_bca string ,_gd ...interface{}){_fda (_cdc ,_cc ,_bca ,_gd ...);
};

// Trace logs trace message.
func (_cb ConsoleLogger )Trace (format string ,args ...interface{}){if _cb .LogLevel >=LogLevelTrace {_cde :="\u005b\u0054\u0052\u0041\u0043\u0045\u005d\u0020";_cb .output (_e .Stdout ,_cde ,format ,args ...);};};
func (_ede WriterLogger )Trace (format string ,args ...interface{}){if _ede .LogLevel >=LogLevelTrace {_fg :="\u005b\u0054\u0052\u0041\u0043\u0045\u005d\u0020";_ede .logToWriter (_ede .Output ,_fg ,format ,args ...);};};

// Error logs error message.
func (_eggd WriterLogger )Error (format string ,args ...interface{}){if _eggd .LogLevel >=LogLevelError {_fa :="\u005b\u0045\u0052\u0052\u004f\u0052\u005d\u0020";_eggd .logToWriter (_eggd .Output ,_fa ,format ,args ...);};};
// Trace logs trace message.
func (_bfd ConsoleLogger )Trace (format string ,args ...interface{}){if _bfd .LogLevel >=LogLevelTrace {_affa :="\u005b\u0054\u0052\u0041\u0043\u0045\u005d\u0020";_bfd .output (_cd .Stdout ,_affa ,format ,args ...);};};

// NewWriterLogger creates new 'writer' logger.
func NewWriterLogger (logLevel LogLevel ,writer _c .Writer )*WriterLogger {logger :=WriterLogger {Output :writer ,LogLevel :logLevel };return &logger ;};
// Notice logs notice message.
func (_dgc WriterLogger )Notice (format string ,args ...interface{}){if _dgc .LogLevel >=LogLevelNotice {_adg :="\u005bN\u004f\u0054\u0049\u0043\u0045\u005d ";_dgc .logToWriter (_dgc .Output ,_adg ,format ,args ...);};};

// LogLevel is the verbosity level for logging.
type LogLevel int ;

// Warning logs warning message.
func (_gbb WriterLogger )Warning (format string ,args ...interface{}){if _gbb .LogLevel >=LogLevelWarning {_afc :="\u005b\u0057\u0041\u0052\u004e\u0049\u004e\u0047\u005d\u0020";_gbb .logToWriter (_gbb .Output ,_afc ,format ,args ...);};};

// IsLogLevel returns true if log level is greater or equal than `level`.
// Can be used to avoid resource intensive calls to loggers.
func (_eg ConsoleLogger )IsLogLevel (level LogLevel )bool {return _eg .LogLevel >=level };

// Notice logs notice message.
func (_feg WriterLogger )Notice (format string ,args ...interface{}){if _feg .LogLevel >=LogLevelNotice {_egf :="\u005bN\u004f\u0054\u0049\u0043\u0045\u005d ";_feg .logToWriter (_feg .Output ,_egf ,format ,args ...);};};
func (_bf ConsoleLogger )IsLogLevel (level LogLevel )bool {return _bf .LogLevel >=level };

// Info logs info message.
func (_edd WriterLogger )Info (format string ,args ...interface{}){if _edd .LogLevel >=LogLevelInfo {_ebd :="\u005bI\u004e\u0046\u004f\u005d\u0020";_edd .logToWriter (_edd .Output ,_ebd ,format ,args ...);};};
func (_gd WriterLogger )Info (format string ,args ...interface{}){if _gd .LogLevel >=LogLevelInfo {_edd :="\u005bI\u004e\u0046\u004f\u005d\u0020";_gd .logToWriter (_gd .Output ,_edd ,format ,args ...);};};

// Trace logs trace message.
func (_fde WriterLogger )Trace (format string ,args ...interface{}){if _fde .LogLevel >=LogLevelTrace {_gdf :="\u005b\u0054\u0052\u0041\u0043\u0045\u005d\u0020";_fde .logToWriter (_fde .Output ,_gdf ,format ,args ...);};};
// Debug logs debug message.
func (_ag WriterLogger )Debug (format string ,args ...interface{}){if _ag .LogLevel >=LogLevelDebug {_afa :="\u005b\u0044\u0045\u0042\u0055\u0047\u005d\u0020";_ag .logToWriter (_ag .Output ,_afa ,format ,args ...);};};

// Info does nothing for dummy logger.
func (DummyLogger )Info (format string ,args ...interface{}){};func _fda (_cf _c .Writer ,_dc string ,_cfa string ,_cfae ...interface{}){_ ,_cg ,_fad ,_ebdb :=_bd .Caller (3);if !_ebdb {_cg ="\u003f\u003f\u003f";_fad =0;}else {_cg =_de .Base (_cg );};_ef :=_d .Sprintf ("\u0025s\u0020\u0025\u0073\u003a\u0025\u0064 ",_dc ,_cg ,_fad )+_cfa +"\u000a";
_d .Fprintf (_cf ,_ef ,_cfae ...);};
// Notice does nothing for dummy logger.
func (DummyLogger )Notice (format string ,args ...interface{}){};var Log Logger =DummyLogger {};

// Warning logs warning message.
func (_aff ConsoleLogger )Warning (format string ,args ...interface{}){if _aff .LogLevel >=LogLevelWarning {_fcd :="\u005b\u0057\u0041\u0052\u004e\u0049\u004e\u0047\u005d\u0020";_aff .output (_cd .Stdout ,_fcd ,format ,args ...);};};

// ConsoleLogger is a logger that writes logs to the 'os.Stdout'
type ConsoleLogger struct{LogLevel LogLevel ;};const (LogLevelTrace LogLevel =5;LogLevelDebug LogLevel =4;LogLevelInfo LogLevel =3;LogLevelNotice LogLevel =2;LogLevelWarning LogLevel =1;LogLevelError LogLevel =0;);
type ConsoleLogger struct{LogLevel LogLevel ;};

// Notice logs notice message.
func (_bg ConsoleLogger )Notice (format string ,args ...interface{}){if _bg .LogLevel >=LogLevelNotice {_fc :="\u005bN\u004f\u0054\u0049\u0043\u0045\u005d ";_bg .output (_e .Stdout ,_fc ,format ,args ...);};};
// Trace does nothing for dummy logger.
func (DummyLogger )Trace (format string ,args ...interface{}){};

// Warning logs warning message.
func (_dg WriterLogger )Warning (format string ,args ...interface{}){if _dg .LogLevel >=LogLevelWarning {_be :="\u005b\u0057\u0041\u0052\u004e\u0049\u004e\u0047\u005d\u0020";_dg .logToWriter (_dg .Output ,_be ,format ,args ...);};};
// IsLogLevel returns true from dummy logger.
func (DummyLogger )IsLogLevel (level LogLevel )bool {return true };func _adf (_bfb _dc .Writer ,_fgd string ,_ec string ,_ga ...interface{}){_ ,_ebb ,_bff ,_be :=_cf .Caller (3);if !_be {_ebb ="\u003f\u003f\u003f";_bff =0;}else {_ebb =_d .Base (_ebb );
};_ecb :=_b .Sprintf ("\u0025s\u0020\u0025\u0073\u003a\u0025\u0064 ",_fgd ,_ebb ,_bff )+_ec +"\u000a";_b .Fprintf (_bfb ,_ecb ,_ga ...);};

// Error logs error message.
func (_cde WriterLogger )Error (format string ,args ...interface{}){if _cde .LogLevel >=LogLevelError {_fd :="\u005b\u0045\u0052\u0052\u004f\u0052\u005d\u0020";_cde .logToWriter (_cde .Output ,_fd ,format ,args ...);};};

// NewConsoleLogger creates new console logger.
func NewConsoleLogger (logLevel LogLevel )*ConsoleLogger {return &ConsoleLogger {LogLevel :logLevel }};

// Logger is the interface used for logging in the unipdf package.
type Logger interface{Error (_a string ,_g ...interface{});Warning (_f string ,_de ...interface{});Notice (_ff string ,_dce ...interface{});Info (_gg string ,_fc ...interface{});Debug (_e string ,_bb ...interface{});Trace (_fe string ,_cb ...interface{});
IsLogLevel (_dg LogLevel )bool ;};

// IsLogLevel returns true if log level is greater or equal than `level`.
// Can be used to avoid resource intensive calls to loggers.
func (_aca WriterLogger )IsLogLevel (level LogLevel )bool {return _aca .LogLevel >=level };
func (_gf WriterLogger )IsLogLevel (level LogLevel )bool {return _gf .LogLevel >=level };

// Debug logs debug message.
func (_gge ConsoleLogger )Debug (format string ,args ...interface{}){if _gge .LogLevel >=LogLevelDebug {_bbc :="\u005b\u0044\u0045\u0042\u0055\u0047\u005d\u0020";_gge .output (_cd .Stdout ,_bbc ,format ,args ...);};};

// WriterLogger is the logger that writes data to the Output writer
type WriterLogger struct{LogLevel LogLevel ;Output _dc .Writer ;};func (_ge ConsoleLogger )output (_bbf _dc .Writer ,_ad string ,_ea string ,_aa ...interface{}){_adf (_bbf ,_ad ,_ea ,_aa ...);};
22 changes: 11 additions & 11 deletions common/tempstorage/diskstore/diskstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@

// Package diskstore implements tempStorage interface
// by using disk as a storage
package diskstore ;import (_eb "github.com/unidoc/unioffice/common/tempstorage";_e "io/ioutil";_g "os";_eg "strings";);
package diskstore ;import (_de "github.com/unidoc/unioffice/common/tempstorage";_f "io/ioutil";_d "os";_e "strings";);

// TempFile creates a new temp directory by calling ioutil TempDir
func (_ba diskStorage )TempDir (pattern string )(string ,error ){return _e .TempDir ("",pattern )};type diskStorage struct{};
func (_g diskStorage )TempDir (pattern string )(string ,error ){return _f .TempDir ("",pattern )};

// SetAsStorage sets temp storage as a disk storage
func SetAsStorage (){_a :=diskStorage {};_eb .SetAsStorage (&_a )};
// RemoveAll removes all files in the directory
func (_fb diskStorage )RemoveAll (dir string )error {if _e .HasPrefix (dir ,_d .TempDir ()){return _d .RemoveAll (dir );};return nil ;};

// Add is not applicable in the diskstore implementation
func (_bad diskStorage )Add (path string )error {return nil };

// RemoveAll removes all files in the directory
func (_f diskStorage )RemoveAll (dir string )error {if _eg .HasPrefix (dir ,_g .TempDir ()){return _g .RemoveAll (dir );};return nil ;};
func (_dd diskStorage )Add (path string )error {return nil };

// Open opens file from disk according to a path
func (_b diskStorage )Open (path string )(_eb .File ,error ){return _g .OpenFile (path ,_g .O_RDWR ,0644)};
// SetAsStorage sets temp storage as a disk storage
func SetAsStorage (){_ee :=diskStorage {};_de .SetAsStorage (&_ee )};

// TempFile creates a new temp file by calling ioutil TempFile
func (_c diskStorage )TempFile (dir ,pattern string )(_eb .File ,error ){return _e .TempFile (dir ,pattern );};
func (_ed diskStorage )TempFile (dir ,pattern string )(_de .File ,error ){return _f .TempFile (dir ,pattern );};

// Open opens file from disk according to a path
func (_a diskStorage )Open (path string )(_de .File ,error ){return _d .OpenFile (path ,_d .O_RDWR ,0644)};type diskStorage struct{};
Loading

0 comments on commit 3e7ab0e

Please sign in to comment.